android - android :id?的范围是什么

标签 android

<分区>

Possible Duplicate:
Scope of R.id values

有人可以阐明 Android 中资源 ID 的范围吗?最近我正在制作一个自定义标题栏,其中包含一个名为“header”的 RelativeLayout。因此,我在我的每个 Activity 的 onCreate() 处理程序中调用了这个标题栏:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.activity_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);  

我的一个 Activity 在其布局中有一个 TextView,id 为“header”,在该 Activity 的 onCreate() 中我做了一个

TextView tv1 = (TextView)findViewById(R.id.header); 

. . .它在运行时因 ClassCastException 而爆炸,显然是因为它认为我正在尝试将 RelativeLayout 转换为 TextView。更改标题栏中 RelativeLayout 的名称修复了它。

但是我真的不明白这个。 Android 资源 ID 是全局的吗?如果是这样,为什么不在构建时捕获此冲突?

请注意,这个问题之前已经在 SO 上被问过:Scope of R.id values . . . OP 说“据我所知”R.id 是全局性的,但我的问题不是重复的,因为我的两个问题都没有真正在那个问题中得到解决。

最佳答案

Are Android resource id's global?

它们在 Activity 中是“全局的”。标题栏在 Activity 中。布局在 Activity 中。来自两者的小部件将在 Activity 中。来自两者的具有相同 ID 的小部件将在 Activity 中,并将代表 findViewById() 调用的冲突点。

If so why wouldn't this collision be caught at build-time?

首先,为什么会这样?构建系统应该如何知道您将采用 res/layout/title_bar.xmlres/layout/whatever_the_heck_you_called_it.xml 并在相同的 Activity ?

其次,拥有重复的 ID 并没有错。作为开发人员,您的工作是调用 findViewById() 任何能给您带来独特结果的东西。例如,您可以这样做:

TextView tv1 = (TextView)(findViewById(android.R.id.content).findViewById(R.id.header));

并保留了重复的 ID。走你所做的路线,拥有不同的 ID,是一个更好的可维护性选择。但是在很多情况下,您会故意使用重复的 ID,例如您实现的每个 AdapterView(例如,ListView),因为它们的内容往往会重复ID(例如,ListView 中的每一行都是从同一行布局资源中标记出来的)。

关于android - android :id?的范围是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11988772/

相关文章:

Android:在生成签名 apk 期间出现此错误

android - "match_parent"高度不适用于 NestedScrollView 内的 RelativeLayout

android - 检查 cordova iOS 上的磁盘空间

android - ActionBar 只显示文本

android - asyncTask 测试不执行

android - 在gridview android中禁用点击事件

java - 在 Android Studio 中将 "java"目录重命名为 "kotlin"

java - 使用 Navigation 包中的 startActivity

java - 如何模拟onLongClick?

java - 如何使用 OKHTTP 取消请求