gpt4 book ai didi

android - 阻止 Android 布局我所有的 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:24 24 4
gpt4 key购买 nike

我目前正在开发一款大量使用 ViewPager 小部件的平板电脑应用程序。我还在屏幕上同时显示了多个 Viewpager。

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

我现在的问题是:是否有可能围绕 ViewPager 实现一个框架,它执行初始布局,然后不传播布局-请求 View 层次结构,因为我知道在初始布局之后布局,框架保持相同大小,不会改变。

我提出了以下框架,但效果不是很好,因为它不是 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;
}
}

感谢您的任何建议!

最佳答案

我知道这个问题有点老了,但我的回答可能会帮助其他人,因为您的问题和 Colin 的回答对我有帮助。

我遇到的问题跟你一模一样。有两种解决方案。首先,您需要确保您的 ViewPager 将其 *layout_width* 和 *layout_height* 设置为 *match_parent*,并且 View 层次结构的组织方式使得 Android 不会得出结论认为它需要重新布局任何ViewPager 父布局。例如,假设您有一个 RelativeLayout,其中有两个固定大小的 View ,一个在另一个下方,一个 ViewPager 在第二个 View 下方。在这种情况下,对 ViewPager 的任何更改都会传播到父布局。但是,如果将这两个固定大小的 View 和 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() 来分别关闭和打开布局请求传播。

关于android - 阻止 Android 布局我所有的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com