【问题标题】:Android - findViewById() and dynamically setting ID'sAndroid - findViewById() 并动态设置 ID
【发布时间】:2012-03-30 21:16:55
【问题描述】:

我有一个 ID 投票 (ids.xml),我为动态创建的视图分配了 ID。现在我的问题很简单——假设我创建了一个新视图并为它分配了一个带有setId()R.id.uniqueId 的ID。稍后,我可以使用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 注册\映射到它分配的视图?

【问题讨论】:

  • 您找到问题的解决方案了吗?我对动态添加的视图有同样的问题。

标签: java android android-layout android-view


【解决方案1】:

您想要的视图是否具有可用于调用 parent.findViewById 的父视图?这可能有助于缩小您的问题范围。

我注意到您的简短示例中缺少一件事:您需要确保将新的 LinearLayout 添加到视图层次结构中,然后才能使用 findViewById 找到它:

findViewById(R.id.parent).addView(l)

您还可以使用hierarchy viewer 查看所有设置是否正确。

【讨论】:

  • 感谢您的退出回答。线性布局是主要布局,即我动态创建和分配的第一个布局。那么我应该将它添加到哪个父母?
  • 你会说 setContentView(l)。
  • 但这就是我所做的,请参阅我的原始帖子。
  • 那不是我第一次看的时候。 :) 但是,如果您希望在将 l 设置为内容视图后能够引用它,您可以调用 getContentView()。我不确定执行 findViewById 是否可以找到内容视图本身(我从未尝试过),但是一旦你引用了它,如果你命名了子视图并将它们添加到其中,你应该能够用他们的 ID 说 findViewById ......我想。
【解决方案2】:

遇到过这种情况,尝试通过make clean来清理你的项目,另外检查findViewById() returns null for custom component in layout XML, not for other components

【讨论】:

  • 我尝试清理项目,但没有帮助,findViewById() 工作正常。
【解决方案3】:

从您给我们的信息来看,该视图似乎从未添加到 Activity 的视图中。这是必要的,因为 findViewById 使用活动的视图作为父视图来查找具有该 ID 的子视图。

如果您正在创建视图,则始终可以将其创建为成员变量,并在以后将其添加到视图中时以这种方式引用它。请注意,视图必须在 设置 id 之后添加。

【讨论】:

  • 感谢您的回答。线性布局是主要布局,即是我动态创建和分配 ID 的第一个布局。如何将其添加到当前正在运行的 (this) 活动中?
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
相关资源
最近更新 更多