8

Aktualnie pracuję nad aplikacją na tablety, która intensywnie korzysta z widgetu ViewPager. Otrzymałem jednocześnie wiele Viewpagers na ekranie.Zatrzymaj Androida przed układaniem wszystkich widoków

Teraz mam następujący problem: Jeśli jeden ViewPager przewija do następnej/poprzedniej strony, musi (oczywiście) ponownie przeliczyć swój układ i dodać/usunąć widoki. Zauważyłem, że requestLayout dzwoni aż na samą górę hierarchii widoków, przez co unieważnia moje Widoki na ekranie tabletu (które są dużo!). Jest to bardzo kosztowne.

Moje pytanie brzmi: czy istnieje możliwość wdrożenia ramka wokół ViewPager który dokłada początkowy układ i wtedy nie propagować layout- wnioski z Up The View Hierarchy jak wiem, że po początkowym układzie, ramka pozostaje ten sam rozmiar i nie ulegnie zmianie.

Wpadłem na następującą ramkę, ale nie działa ona całkiem dobrze, ponieważ nie działa w 100% przypadków.

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; 
    } 
} 

Dzięki za porady!

Odpowiedz

0

Naprawdę chciałbym móc powiedzieć, że był lepszy sposób, ale nie sądzę, że istnieje. Jeśli ViewPager ma wbudowane dodawanie/usuwanie widoków, twój układ będzie stale niszczony, nawet jeśli nie jest, może być. To leniwe założenie, że zawartość może się zmienić (a tym samym unieważnić w górę), a do nas trudne programy, aby usunąć niektóre z tych założeń.

Jeśli możesz zapewnić, że granice FrameLayout nigdy się nie zmienią, nie ma żadnej szkody w sytuacji, gdy requestLayout nadmiernie się pojawi.

4

Wiem, że pytanie jest trochę stare, ale moja odpowiedź może pomóc komuś innemu jako twoje pytanie, a odpowiedź Colina pomogła mi.

Mam dokładnie taki sam problem jak Ty. Są dwa rozwiązania tego problemu. Najpierw upewnij się, że Twój ViewPager ma * layout_width * i * layout_height * ustawiony na * match_parent *, a hierarchia widoku jest zorganizowana w taki sposób, że Android nie dojdzie do wniosku, że musi zmienić układ dowolny z układów nadrzędnych ViewPager. Załóżmy na przykład, że masz RelativeLayout z dwoma widokami o stałych rozmiarach jeden pod drugim i ViewPager pod drugim widokiem. W takim przypadku każda zmiana w ViewPager zostanie przeniesiona do układu nadrzędnego. Jeśli jednak umieścisz te dwa widoki o stałym rozmiarze, a ViewPager w LinearLayout tak się nie stanie, żadne żądanie układu nie będzie propagowane poza ViewPager. Co więcej, żądanie układu na jednej stronie ViewPager nie będzie propagowane również na inne strony.

Drugie rozwiązanie (w rzeczywistości jest to bardziej druga część roztworu) to FrameLayout, ale zmodyfikowany tak:

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(); 
     } 
    } 
} 

W mojej aplikacji Wzywam setPropagateRequestLayout() w Fragment onStart i OnStop metody do włączają żądania układu propagujące się i włączają odpowiednio.

Powiązane problemy