草庐IT

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

coder 2023-11-22 原文

我目前正在开发一款大量使用 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/

有关android - 阻止 Android 布局我所有的 View的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  8. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby - nanoc 和多种布局 - 2

    是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

随机推荐