视图ID是活动上下文的本地吗?

时间:2016-08-10 21:34:40

标签: android android-activity android-view

视图标识符的范围是什么?

它的相应活动是否是本地的?

例如,如果在 activity_main.xml 中,我指定

<EditText android:id="@+id/edit_message" />

在我的 DisplayMessageActivity.java 中,我是否可以合法访问R.id.edit_message

当我测试这个时,我得到一个例外,但是没有一条消息清楚地告诉我这是因为访问了“id out of context”,或者说是这样的。我收到了java.lang.NullPointerException

等错误

当我跟随初学者教程时出现了这个问题:

https://developer.android.com/training/basics/firstapp/building-ui.html

修改 感谢两者澄清了R.id的范围与ID为R.id.edit_message的小部件范围之间的差异(就fiewViewById()访问它而言)。

我实际上打算问“我能在活动A中调用findViewById(R.id.edit_message)来访问活动B中的小部件”。从你的答案来看,这个问题的答案似乎是“不”。

在我的代码中,我没有在活动B的ViewGroup中包含id为R.id.edit_message的视图。这可能是我收到错误的原因。

2 个答案:

答案 0 :(得分:2)

  

视图标识符的范围是什么?

标识符是整数。它没有范围。

  

在我的DisplayMessageActivity.java中,我是否可以合法地访问R.id.edit_message?

如果我们假设您的意思是&#34;我是否可以致电findViewById(R.id.edit_message)来访问小部件?&#34;,您当然可以调用它。是否获得null取决于活动是否在其视图层次结构中具有该ID的小部件。

但是,活动A无法调用findViewById()从活动B中检索窗口小部件.id是一个整数,没有范围。但是, findViewById() 有一个范围:您调用它的视图层次结构(例如,活动,ViewGroup)。

答案 1 :(得分:1)

您使用XML输入的任何ID都将被处理并放入R.java文件中的唯一整数值​​(您不应编辑)。 ID值尤其会进入R.id,就像R.layout标识的布局XML文件一样。

要回答您的问题,范围是全球性的。至少在哪里可以

import your.package.name.R;

例如,您有两个活动,每个活动都有EditText android:id="@+id/edit_message" 在这种情况下,您可以在两个活动中使用findViewById(R.id.edit_message),但R.id.edit_message的值相同。

就“范围”而言,findViewById()YourActivity.this.findViewById()的简写,因此您将搜索当前活动的内容视图。

因为你得到了例外。很难说。一种可能性是您使用错误的XML布局setContentView()findViewById()返回null。您可以阅读文档中的原因。