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

sab*_*der 9 android android-widget android-custom-view android-layout android-viewpager

我正在开发一款强烈使用ViewPagerWidget 的平板电脑应用程序.我也同时在屏幕上有多个Viewpagers.

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

我现在的问题是:是否有可能围绕ViewPager实现一个Frame,它执行初始Layout,然后不会在View Hierarchy上传播布局请求,因为我知道在初始布局之后,框架保持相同的大小并且将会没变.

我提出了下面的框架,但它不能很好地工作,因为它不能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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议!

Mil*_*lan 6

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

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

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


Col*_*sey 1

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

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