8

В настоящее время я разрабатываю планшетное приложение, которое интенсивно использует виджет ViewPager. Я также сразу получил несколько просмотрщиков на экране.Остановить Android от Layouting all my Views

У меня возникла следующая проблема: Если один ViewPager прокручивается до следующей/предыдущей страницы, он (конечно) должен пересчитать свой макет и добавить/удалить Views. Я заметил, что requestLayout звонит прямо к верхней части иерархии просмотра, поэтому делает недействительным ВСЕ моих просмотров на экране планшета (которые много!). Это очень дорогостоящее.

Мой вопрос теперь: есть ли возможность реализовать рамку вокруг ViewPager, который делает первоначальный макет, а затем не распространяется layout- запросов, до режима просмотра иерархии, как я знаю, что после первоначального расположения, рамка остается того же размера и не изменится.

Я придумал следующий кадр, но он не работает достаточно хорошо, потому что он не работает в течение 100% времени.

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

Спасибо за любой совет!

ответ

0

Мне очень жаль, что я не мог сказать вам, что есть лучший способ, но я не думаю, что есть. Если ViewPager неинтересно добавляет/удаляет представления, ваш макет будет постоянно разбиваться, даже если это не так. Это ленивое предположение, что содержимое может измениться (таким образом, недействительным вверх), и его до нас сложно реализовать некоторые из этих предположений.

Если вы можете заверить, что границы FrameLayout никогда не будут изменены, нет никакого вреда в over-writing requestLayout вообще.

4

Я знаю, что вопрос немного устарел, но мой ответ может помочь кому-то другому в вашем вопросе, и ответ Колина помог мне.

У меня точно такая же проблема, как и у вас. И для этого есть два решения. Прежде всего вам нужно убедиться, что ваш ViewPager имеет * layout_width * и * layout_height *, установленный в * match_parent *, и эта иерархия взглядов организована таким образом, что Android не придет к выводу, что ему необходимо переустановить любой из родительских макетов ViewPager. Например, у вас есть RelativeLayout с двумя видами фиксированных размеров один под другим и ViewPager под вторым видом. В этом случае любое изменение в ViewPager будет распространяться на родительский макет. Однако, если вы разместите эти два вида фиксированного размера и ViewPager в LinearLayout, этого не произойдет, запрос макета не будет распространяться за пределы ViewPager. Что еще лучше, запрос макета на одной странице ViewPager не будет распространяться и на другие страницы.

Второе решение (на самом деле это скорее вторая часть решения) Ваш FrameLayout, но изменен так:

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

В моем приложении я называю setPropagateRequestLayout() в Fragment OnStart и OnStop методы в разворачивать запросы макета, разворачивающиеся соответственно.

Смежные вопросы