我目前正在开发一款强力使用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;
}
}
感谢您的任何建议!
答案 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就没有坏处。