我对ID(ids.xml
)进行了调查,并为动态创建的视图分配了id。现在我的问题非常简单 - 假设我创建了一个新视图,并将setId()
与R.id.uniqueId
结合使用。稍后,我可以使用findViewById(R.id.uniqueId)
访问该视图吗?
如果是这样,它返回null的原因是什么?
以下是一个玩具示例:更新
LinearLayout l = new LinearLayout(this);
l.setId(R.id.mId);
setContentView(l); //i see on screen the views added to 'l'
l = (LinearLayout) findViewById(R.id.mId); //it returns null :(
为什么不注册\将已分配的ID映射到它所分配的视图?
答案 0 :(得分:2)
您所需的视图是否具有可用于调用parent.findViewById的父视图?这可能有助于缩小您的问题范围。
我注意到您的简短示例中遗漏了一件事:您需要确保在将新的LinearLayout添加到视图层次结构中之后才能使用findViewById找到它:
findViewById(R.id.parent).addView(l)
您还可以使用hierarchy viewer查看是否正确设置了所有内容。
答案 1 :(得分:1)
多次遇到这种情况,尝试通过干净来清理项目,同时检查findViewById() returns null for custom component in layout XML, not for other components
答案 2 :(得分:0)
根据您提供给我们的信息,该视图似乎永远不会添加到活动视图中。这是必要的,因为findViewById使用活动的视图作为父级来查找具有该Id的子视图。
如果要创建视图,则始终可以将其创建为成员变量,如果要在以后将其添加到视图中,请以此方式引用它。请注意,必须在设置ID后添加视图。