OnGlobalLayoutListener:弃用和兼容性

2023-11-25

我必须使用OnGlobalLayoutListener对象,然后删除侦听器,我遇到了不推荐使用的方法的问题,我用以下代码解决了这个问题。

protected void onCreate(Bundle savedInstanceState) {
    final LinearLayout llTotal = (LinearLayout) findViewById(R.id.mmc_ll);
    ViewTreeObserver vto = llTotal.getViewTreeObserver();
    if(vto.isAlive()){
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //
                // mycode
                //
                if (Build.VERSION.SDK_INT<16) {
                    removeLayoutListenerPre16(llTotal.getViewTreeObserver(),this);
                } else {
                    removeLayoutListenerPost16(llTotal.getViewTreeObserver(), this);
                }
            } 
        });
    }
    super.onCreate(savedInstanceState);
}

@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
    observer.removeGlobalOnLayoutListener(listener);
}

@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
    observer.removeOnGlobalLayoutListener(listener);
}

这是对的吗?有更好的方法来处理兼容性吗?

使用 API 10 在模拟器中运行代码我在 LogCat 中收到以下警告

04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V

我可以忽略它们或者我必须以某种方式修复它们吗?


我在我的项目中使用这个:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
    if (Build.VERSION.SDK_INT < 16) {
        v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
    } else {
        v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
    }
}

看起来和你的很相似。 在不同设备(4.2.2 和 2.3.3)上进行测试,运行完美。 似乎这是唯一的方法...如果您发现其他任何内容,我想知道。 祝你好运

2020 编辑这种方法已经非常非常过时了。我希望您将代码移至 Kotlin。 现在我们可以在使用 ktx 库时使用 doOnPreDraw 函数。https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnPreDraw(kotlin.Function1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OnGlobalLayoutListener:弃用和兼容性 的相关文章

  • 单击弹出菜单时为什么导航栏出现在全屏应用程序中

    我有一个全屏应用程序 MainActivity java public class MainActivity extends AppCompatActivity TargetApi Build VERSION CODES KITKAT pr
  • 如何使用 ProGuard 将所有方法保留在类中

    我使用 ProGuard 来优化我的 Android 应用程序 然而 对于 Android 仪器测试 我需要一些 但不是全部 类来保留所有成员 我尝试了各种方法 最后一个是 keepclassmembers public class com
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 如何在 Android / Java 中获取图像的分辨率

    如何在 Android 中找到任何图像的分辨率 获取存储在磁盘中的图像大小的有效方法 例如获取用户选择上传的图像文件的大小 是使用BitmapFactory Options并设置inJustDecodeBounds为真 这样做你就会获取图像
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • 在 Android 中长按时从操作模式中删除后退/主页按钮

    我已经在里面长按实现了上下文操作模式recycler view 为此我打电话给ActionModeCallback从创建动作模式开始 创建动作模式时 默认显示后退箭头 检查如下 单击后退箭头 操作模式将关闭 现在我想要hide or rem
  • Retrofit-2 内容类型问题

    我的 Api 接受 Content Type application json 作为标头 我按照改造文档中所述完美设置了标题 Headers Content Type application json POST user classes C
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 无法获取 Facebook 传入请求

    我正在尝试在我的 Facebook android 游戏应用程序中实现发送数据并接受该数据 我正在关注https developers facebook com docs android send requests notification
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • onClick 未在带有子项的 LinearLayout 上触发

    我有一个自定义的 LinearLayout 和一个较小的 TextView 子级 我希望能够单击 TextView 未覆盖的区域 因此我将 clickable true 和 onclicklistener 设置为 LinearLayout
  • Android 从命令行停止模拟器

    这个问题与如何通过命令行关闭Android模拟器 https stackoverflow com questions 5912403 how to shut down android emulator via cmd 但是 在尝试第一个答案
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于

随机推荐

  • 将 MATLAB 链接到 DLL 库

    我正在尝试执行 MATLAB 工具包中的一些示例代码 oscmex 该工具包允许使用 OSC 协议通过 MATLAB 进行通信 我认为这个问题是不具体的 它应该适用于any工具包就是按照这个方式设置的 撇开原因不谈 我在启动和运行该工具包时
  • 将日期和时区从 GAE 服务器发送到 GWT 客户端

    好吧 伙计们 我已经解决这个问题大约两周了 现在尝试了我能想到的一切 并查看了这里的大量答案 感觉他们会回答这个问题 但我就是不知道我该怎么做做我想做的事 这让我发疯 似乎没有人在任何地方都有答案 到处都有一半的答案 但似乎没有人真正做我需
  • 如何访问ratchet php周期性循环和客户端在应用程序内发送?

    我有一个运行良好的 Ratchet 服务器和聊天应用程序类 我的问题是如何添加周期性循环 我尝试按照中的示例进行操作定期向 Ratchet 中的客户端发送消息 但我却一事无成 我的目标就像这个人一样 是让服务器检查所有客户端是否仍然存在 每
  • 动态更改 Angular 4 组件的模板

    使用 Angular 4 1 我尝试在渲染模块之前动态更改模块类型的模板 这可能吗 我们正在页面上引导未知数量的组件 来自已知的组件类型列表 并且该页面可能包含相同类型的多个组件 我找到了一种方法 为每个组件提供不同的选择器 以便可以单独呈
  • 保留顺序的 HashSet

    我需要一个保留插入顺序的 HashSet 框架中是否有任何实现 标准 NETHashSet不保留插入顺序 对于简单的测试 插入顺序可能会因意外而被保留 但不能保证并且并不总是这样 证明中间做一些删除就足够了 有关更多信息 请参阅此问题 Ha
  • 防止将查询生成器与 DB::raw() 相结合的查询的 SQL 注入

    在 Laravel 4 中 我想保护一些复杂的数据库查询免遭 SQL 注入 这些查询结合使用查询生成器和 DB raw 这是一个简化的示例 field email user DB table users gt select DB raw f
  • Android 持久空间:“无法弄清楚如何从光标读取此字段”

    我正在尝试使用新的 Android Persistence Room 库在两个数据库表之间创建关系 我查看了文档并尝试实现在以下位置找到的示例https developer android com reference android arc
  • 将 SVG 转换为 PDF

    如何以编程方式将 SVG 文件转换为 PDF 在生成 PDF 之前 我需要在某些方面更改 SVG 因此仅使用工具对其进行预转换是不够的 理想情况下使用 Java 但 Perl 或 PHP 也可以 显然 我基本上正在考虑 Apache FOP
  • 以编程方式启动德比

    请看下面的代码 数据库连接器 java import java sql import javax swing public class DataBaseConnector private Connection con public Data
  • 在 Visual Studio 2015 中混合 - 无设计视图

    我想在 Visual Studio 2015 中用 C 构建一个应用程序 并且想使用 Blend 创建一个用户界面 但它只向我显示 MainPage xaml 中的代码 而不是图形视图 我应该怎么办 它看起来是这样的 您必须将应用程序的目标
  • 在 R 中,以点开头的变量存储在哪里?

    我对以点开头的变量感到好奇 例如 var lt 100 它不属于全球环境 这个变量属于什么环境 gt ls all names TRUE envir GlobalEnv 1 Random seed var a 查看手册页ls 通过输入 ls
  • 无法在 vscode 上渲染 ipynb 文件中的图像

    我已经安装了 vscode 和官方的 microsoft python 包 除了 markdown 中的图像渲染之外 一切都很好 我尝试使用以下代码在降价单元格中显示图像 img src images grad summary png st
  • 对象不支持属性或方法“indexOf”

    我正在使用下面的代码 它是如
  • 无法加载文件或程序集“Microsoft.ReportViewer.Common,版本=11.0.0.0”

    我最近升级了我的 n 层解决方案 NET 3 5 与 2008 到 4 5 Visual Studio 2012 除了 Crystal Reports 之外 一切都很顺利 我必须通过以下链接为 Visual Studio 2012 安装新的
  • Pickle 转储替换当前文件数据

    当我使用pickle时 它工作得很好 我可以卸载任何负载 问题是 如果我关闭程序并尝试再次转储 它会用新的转储替换旧的文件数据 这是我的代码 import pickle import os import time dictionary di
  • 系统如何选择正确的页表?

    让我们关注单处理器计算机系统 据我所知 当创建进程时 就会建立页表 将虚拟地址映射到物理内存地址空间 每个进程都有自己的页表 存储在内核地址空间中 但是 由于不仅有一个进程在运行 并且会发生很多上下文切换 MMU 如何为进程选择正确的页表呢
  • 应用程序已部署。无需重新安装

    无法在模拟器上运行应用程序 也无法在设备本身上运行应用程序 当我在 Android 设备上运行它时 它说 应用程序已部署 无需重新安装 当我在手机上什至找不到项目应用程序时 如果您想确保应用程序已重新安装 您可以在命令行中执行此操作 adb
  • SpriteKit如何获取正确的屏幕尺寸

    我试过了 self frame size self view frame size UIScreen mainScreen bounds size 它们都不起作用 如何获得设备的正确屏幕尺寸 您可以使用以下快速代码来获取屏幕尺寸 let d
  • 有没有办法重写Spark RDD unique以使用mapPartitions而不是distinct?

    我有一个 RDD 太大 无法一致地执行不同的语句而不产生虚假错误 例如 SparkException 阶段失败 4 次 ExecutorLostFailure HDFS 文件系统关闭 达到执行器失败的最大数量 由于 SparkContext
  • OnGlobalLayoutListener:弃用和兼容性

    我必须使用OnGlobalLayoutListener对象 然后删除侦听器 我遇到了不推荐使用的方法的问题 我用以下代码解决了这个问题 protected void onCreate Bundle savedInstanceState fi