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;
例如,您有两个活动,每个活动都有一个 EditText
和 android:id="@+id/edit_message"
。
在那种情况下,您可以在两个活动中使用 findViewById(R.id.edit_message)
,但 R.id.edit_message
的值是相同的。
就 "scoping" 而言,findViewById()
是 YourActivity.this.findViewById()
的 shorthand,因此您将搜索当前 Activity 的内容视图.
因为你得到异常的原因。很难说。一种可能是您为 setContentView()
使用了错误的 XML 布局,并且 findViewById()
返回了 null。您可以阅读文档了解原因。
视图标识符的范围是什么?
它是否在其对应的 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;
例如,您有两个活动,每个活动都有一个 EditText
和 android:id="@+id/edit_message"
。
在那种情况下,您可以在两个活动中使用 findViewById(R.id.edit_message)
,但 R.id.edit_message
的值是相同的。
就 "scoping" 而言,findViewById()
是 YourActivity.this.findViewById()
的 shorthand,因此您将搜索当前 Activity 的内容视图.
因为你得到异常的原因。很难说。一种可能是您为 setContentView()
使用了错误的 XML 布局,并且 findViewById()
返回了 null。您可以阅读文档了解原因。