从Layouting我的所有视图中停止Android

时间:2012-03-26 08:33:30

标签: android android-layout android-widget android-viewpager android-custom-view

我目前正在开发一款强力使用ViewPager Widget的平板电脑应用。我也同时在屏幕上有多个Viewpage。

现在我遇到以下问题: 如果一个ViewPager滚动到下一个/上一个页面,它(当然)必须重新计算它的布局并添加/删除视图。我注意到requestLayout调用直到视图层次结构的顶部,因此在平板电脑屏幕上使我的视图的全部无效(这很多!)。 这是非常昂贵的

我现在的问题是:是否有可能在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;
    }
}

感谢您的任何建议!

2 个答案:

答案 0 :(得分:5)

我知道这个问题有点陈旧,但我的回答可能会帮助别人,因为你的问题和科林的答案对我有帮助。

我和你有完全相同的问题。它有两种解决方案。 首先,您需要确保您的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();
        }
    }
}

在我的应用程序中,我在Fragment onStart和onStop方法中调用setPropagateRequestLayout()来分别关闭和打开布局请求。

答案 1 :(得分:1)

我真的希望我能告诉你有更好的方法,但我认为没有。如果ViewPager实际上是添加/删除视图,那么您的布局将不断被删除,即使它不是,也可能是。这是一个懒惰的假设,内容可能会改变(从而使向上无效),并且由我们制定一些棘手的程序来消除这些假设。

如果你可以确保FrameLayout的界限永远不会改变,那么覆盖requestLayout就没有坏处。