8

我目前正在開發一款強力使用ViewPager Widget的平板電腦應用程序。我也一次在屏幕上看到多個Viewpage。停止安裝Android Layouts all my Views

現在我遇到了以下問題: 如果一個ViewPager滾動到下一個/上一個頁面,它(當然)必須重新計算它的佈局並添加/刪除視圖。我注意到requestLayout調用直到查看層次結構的頂部,因此我無法在平板電腦屏幕上看到我的視圖的ALL(這是很多!)。 這是非常昂貴的。現在

我的問題是:是否有實現其周圍進行初始佈局的ViewPager框架的可能性,然後不會傳播於版圖請求了視圖層次我所知,最初的佈局後,框架保持相同的大小,不會改變。

我想出了以下框架,但它不能很好地工作,因爲它不能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的界限永遠不會改變,那麼覆蓋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()的片段在onStart和的onStop方法分別關閉和打開佈局請求。