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

Are view ids local to the activity context?

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

它是否在其对应的 activity 本地?

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

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

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

当我测试这个时,我得到一个异常,但是 none 的消息清楚地告诉我这是由于访问 "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() 访问它而言)。

其实我是想问"would I be able to call findViewById(R.id.edit_message) in Activity A to access a widget in Activity B"的。从您的回答来看,该问题的答案似乎是 "no"。

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

What is the scope of the a view's identifier?

标识符是一个整数。它没有作用域。

Within my DisplayMessageActivity.java would I legally be able to access R.id.edit_message?

如果我们假设你的意思是"would I be able to call findViewById(R.id.edit_message) to access a widget?",你当然可以调用它。您是否获得 null 将取决于 activity 在其视图层次结构中是否具有具有该 ID 的小部件。

但是,Activity A 无法调用 findViewById() 从 Activity B 检索小部件。id 是一个整数,没有作用域。然而,findViewById() 有一个作用域:无论你调用它的视图层次结构(例如,activity、ViewGroup)。

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

回答你的问题,范围是全球的。至少在任何地方都可以

import your.package.name.R;

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

就 "scoping" 而言,findViewById()YourActivity.this.findViewById() 的 shorthand,因此您将搜索当前 Activity 的内容视图.


因为你得到异常的原因。很难说。一种可能是您为 setContentView() 使用了错误的 XML 布局,并且 findViewById() 返回了 null。您可以阅读文档了解原因。