8

Attualmente sto sviluppando un'applicazione per tablet che utilizza intensamente il widget ViewPager. Ho anche avuto più Viewpager sullo schermo in una volta.Arresta Android dal layout di tutte le mie viste

Ora sto riscontrando il seguente problema: Se un ViewPager scorre alla pagina successiva/precedente, (ovviamente) deve ricalcolare il layout e aggiungere/rimuovere le viste. Ho notato che le chiamate requestLayout vengono visualizzate direttamente nella parte superiore della gerarchia di visualizzazione, invalidando quindi TUTTE le delle mie visualizzazioni sullo schermo del tablet (che sono molte!). Questo è molto costoso.

La mia domanda ora è: esiste una possibilità di implementare una cornice intorno al ViewPager che fa il layout iniziale e poi non propaga le richieste Layout- la vista gerarchia come so che dopo il layout iniziale, il telaio rimane della stessa dimensione e non cambierà.

Mi è venuto in mente il seguente Frame, ma non funziona abbastanza bene, perché non funziona il 100% delle volte.

public class MyFrame extends FrameLayout 
{ 
    // VARIABLE CONTROLLING THE DISPATCH OF THE LAYOUT 
    // REQUEST UP THE VIEW HIERARCHY 
    private boolean doLayout = true; 

    public MyFrame(Context context) 
    { 
     super(context); 
     doLayout = true; 
    } 

    @Override 
    public void requestLayout() 
    { 
     if (doLayout) // DO THE LAYOUT REQUEST UP TO THE TOP 
      super.requestLayout(); 
     else 
     { 
      // JUST MEASURE MYSELF AND MY CHILDREN 
      measure(MeasureSpec.getMode(MeasureSpec.AT_MOST), 
      MeasureSpec.getMode(MeasureSpec.AT_MOST)); 
      layout(getLeft(), getTop(), getRight(), getBottom()); 
     } 
     doLayout = false; 
    } 
} 

Grazie per qualsiasi consiglio!

risposta

0

Vorrei davvero poterti dire che c'era un modo migliore, ma non credo che ci sia. Se il ViewPager è in pratica l'aggiunta/rimozione di viste, il layout verrà continuamente cestinato, anche se non lo è, potrebbe essere. È un'ipotesi pigra che il contenuto potrebbe cambiare (invalidando quindi in senso inverso), e sta a noi programmi ingannevoli per rimuovere alcuni di questi presupposti.

Se si può assicurare che i limiti di FrameLayout non cambieranno mai, non c'è alcun danno nella sovrascrittura di requestLayout.

4

So che la domanda è un po 'vecchia, ma la mia risposta potrebbe aiutare qualcun altro come la tua domanda e la risposta di Colin mi ha aiutato.

Ho esattamente lo stesso problema di te. E ci sono due soluzioni per questo. Per prima cosa è necessario assicurarsi che ViewPager abbia * layout_width * e * layout_height * impostato su * match_parent *, e che la gerarchia della vista sia organizzata in modo tale che Android non giunga alla conclusione che deve essere riformattato uno qualsiasi dei layout principali di ViewPager. Ad esempio, supponiamo di disporre di un RelativeLayout con due viste di dimensioni fisse una sotto l'altra e un ViewPager sotto la seconda vista. In questo caso, qualsiasi modifica a ViewPager verrà propagata al layout principale. Tuttavia, se metti queste due viste a dimensione fissa e il ViewPager in un LinearLayout, ciò non accadrà, nessuna richiesta di layout verrà propagata oltre ViewPager. Cosa c'è di meglio, la richiesta di layout su una pagina di ViewPager non verrà propagata anche ad altre pagine.

La seconda soluzione (in realtà è più la seconda parte della soluzione) è il vostro FrameLayout, ma modificato in questo modo:

public class LayoutStopperFrameLayout extends FrameLayout { 

    private boolean doLayout; 

    public LayoutStopperFrameLayout(Context context) { 
     super(context); 
     doLayout = true; 
    } 

    public LayoutStopperFrameLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     doLayout = true; 
    } 

    public LayoutStopperFrameLayout(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
     doLayout = true; 
    } 

    public void setPropagateRequestLayout(boolean doLayout) { 
     this.doLayout = doLayout; 
    } 

    @Override 
    public void requestLayout() { 
     if (doLayout) { 
      // DO THE LAYOUT REQUEST UP TO THE TOP 
      super.requestLayout(); 
     } 
    } 
} 

Nella mia applicazione chiamo setPropagateRequestLayout() in Frammento onStart e metodi OnStop a trasforma le richieste di layout in propagazione off e on rispettivamente.

Problemi correlati