android:id 的范围是什么? [复制]

2023-12-30

可能的重复:
R.id值的范围 https://stackoverflow.com/questions/3719147/scope-of-r-id-values

有人可以澄清 Android 中资源 ID 的范围吗?最近我正在制作一个自定义标题栏,其中包含一个名为“标题”的相对布局。我在调用这个标题栏onCreate()我的每项活动的处理者如下:

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

我的一项活动在其布局中有一个 TextView,其 id 为“header”,并且在该活动的onCreate()我做了一个

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

。 。 。它在运行时因 ClassCastException 爆炸,显然是因为它认为我试图将relativelayout转换为textview。更改标题栏中的relativelayout的名称修复了它。

但我真的不太明白这一点。 Android资源id是全局的吗?如果是这样,为什么这种碰撞不会在构建时被捕获?

请注意,这个问题之前已经被问过:R.id值的范围 https://stackoverflow.com/questions/3719147/scope-of-r-id-values。 。 。 OP 说“据我所知”,R.id 是全球性的,但我的问题不是重复的,因为我的两个问题都没有真正得到解决。


Android资源id是全局的吗?

它们在活动中是“全局的”。标题栏位于活动中。布局在活动中。两者的小部件都将在活动中。两者具有相同 ID 的小部件将出现在活动中,并且将代表冲突点findViewById() calls.

如果是这样,为什么这种碰撞不会在构建时被捕获?

首先,为什么会这样?构建系统应该如何知道你将要采取的res/layout/title_bar.xml and res/layout/whatever_the_heck_you_called_it.xml并在同一个活动中使用它们?

其次,拥有重复的ID并没有什么问题。作为开发人员,您的工作是call findViewById()任何能给你带来独特结果的事情。例如,您可以这样做:

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

并保留重复的 ID。就可维护性而言,采用您所做的路线(拥有不同的 ID)是更好的选择。但在很多情况下,您会故意使用重复的 ID,例如每个AdapterView你曾经实施过(例如,ListView),因为它们的内容往往有重复的 ID(例如,ListView从相同的行布局资源中删除)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android:id 的范围是什么? [复制] 的相关文章

随机推荐