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)
谢谢你的建议!
我知道这个问题有点老了,但我的回答可能会帮助别人,因为你的问题和科林的回答对我有帮助.
我和你有完全相同的问题.它有两种解决方案.首先,您需要确保您的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()来分别关闭和打开布局请求.
我真的希望我能告诉你有更好的方法,但我认为没有。如果 ViewPager 实际上添加/删除视图,您的布局将不断被废弃,即使不是,也可能是。这是一个懒惰的假设,内容可能会改变(从而向上无效),并且由我们棘手的程序来删除其中一些假设。
如果您可以确保 FrameLayout 的边界永远不会改变,那么覆盖 requestLayout 就没有什么坏处。
| 归档时间: |
|
| 查看次数: |
1347 次 |
| 最近记录: |