使用 Android 的资源覆盖机制覆盖布局文件时 findViewById 返回 null

问题描述

我想修改 AOSP 代码中现有的布局 A,但我不想直接修改此布局 A,而是想定义一个覆盖布局 A 的新布局 B,以避免修改原始布局。

overlay 目录中布局 B 的目录结构与布局 A 的目录结构相匹配,overlay 目录已经在 make 文件中像这样定义了

PRODUCT_PACKAGE_OVERLAYS := <my-overlay-directory>

在布局 A 中,一些视图定义了一些关联的 id。这些 id 在这样的 Java 源文件中被引用

object.setContentView(contentView);

...

final View myView1 = object.findViewById(R.id.someViewId1);
final View myView2 = myView1.findViewById(R.id.someViewId2);

在新布局 B 中,视图的定义方式与布局 A 完全相同,具有相同的 id。但是,在运行时,我看到调用 myView1.findViewById(R.id.someViewId2) 时出现 NullPointerException,这表明 myView1 为空。在overlay目录中没有布局B,原来的代码可以正常工作,但是当布局被覆盖时会出现异常。这让我相信 findViewById 在覆盖布局文件时没有正确找到视图。有谁知道为什么 findViewById 返回 null 以及是否可以覆盖布局文件

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)