findViewById()为getChildAt()找到的视图返回null

时间:2012-12-11 14:59:18

标签: android android-layout android-source findviewbyid

我正在对AOSP SystemUI应用程序进行一些修改,并且在尝试在任意设备上运行时遇到了一个非常特殊的问题:findViewById()返回null,同时浏览其中孩子们发现它确实存在。

我正在使用this AOSP source code并通过lunch full-engmake进行构建。它编译得很好,但是SystemUI在第337行的逻辑中与IllegalArgumentException崩溃:

mRecentsContainer = (ViewGroup) findViewById(R.id.recents_container);
[...]
if (mRecentsContainer instanceof RecentsHorizontalScrollView){
    [...]
} else if (mRecentsContainer instanceof RecentsVerticalScrollView){
    [...]
}
else {
    throw new IllegalArgumentException("missing Recents[Horizontal]ScrollView");
}

一些调试显示mRecentsContainer实际上是null

我认为可能是一个布局被夸大而没有包含该特定视图,所以为了检查,我使用getChildCount()getChildAt()以递归方式浏览所有视图的子项。事实并非如此; @id/recents_container就在那里,两层深处:

> @id/recents_root (7f0e0070) [RecentsPanelView]: (2 children)
--> @id/recents_bg_protect (7f0e0071) [FrameLayout]: (2 children)
----> @id/recents_container (7f0e0072) [RecentsVerticalScrollView]: (1 children)
------> @id/recents_linear_layout (7f0e0073) [LinearLayout]: (0 children)
----> @id/recents_no_apps (7f0e0074) [FrameLayout]: (1 children)
------> [unnamed] (ffffffff) [TextView]
--> @id/recents_dismiss_button (7f0e0075) [View]

安装应用程序时,来自system_process的Logcat会出现一个单一提示:

  

12-11 22:38:01.090:W / ResourceType(165):无法在包0中输入0x7f060000(t = 5 e = 0)(错误-75)

检查R.java目录中的SystemUI_intermediates会发现它指向一个看似无关的status_bar_recents_app_label_color,这只是res/values/color.xml中定义的颜色。

导致这种情况的原因是什么?布局是不是正确膨胀,因为我在我没有编译的设备上运行它?我认为可能问题可能是SystemUI对内部Android资源的引用,这些资源可能无法正确映射到我设备上的资源。这可能吗?

1 个答案:

答案 0 :(得分:1)

显然,一些生成的文件仍然存在。

从头开始重建源make clean解决了它。

或者,我已经发现删除以下中间目录可以加快构建速度,但我不能100%确定它涵盖了所有目录:

rm -rf out/target/product/generic/obj/APPS/SystemUI_intermediates/
rm -rf out/target/common/R/com/android/systemui
rm -rf out/target/product/generic/obj/APPS/framework-res_intermediates/
rm -f /out/target/common/R/com/android/internal/R.java
rm -rf out/target/product/generic/obj/PACKAGING/
rm -f out/target/product/generic/system/app/SystemUI.apk