Android id
概述
安卓id
是一个常用于标识视图的整数;这id
可以通过 XML(如果可能)和代码(以编程方式)进行分配。id
对于获取 XML 定义的引用最有用View
s 由一个生成Inflater
(例如通过使用setContentView
.)
Assign id
via XML
- 添加一个属性
android:id="@+id/
somename"
以你的观点。
- 当您的应用程序构建时,
android:id
将被分配一个unique int
用于代码中。
- 参考你的
android:id
's int
代码中的值使用“R.id.
somename”(实际上是一个常量。)
-
this
int
可以从构建到构建进行更改 so 切勿复制 id from gen/
包裹名字/R.java
,只需使用“R.id.
某个名字”。
- (此外,一个
id
分配给一个Preference
在 XML 中不使用时Preference
生成其View
.)
Assign id
通过代码(以编程方式)
- 手动设置
id
s using someView.setId(
int);
- The
int
必须是积极的,但在其他方面是任意的——它可以是你想要的任何东西(如果这很可怕,请继续阅读。)
- 例如,如果创建表示项目的多个视图并对其进行编号,则可以使用它们的项目编号。
的独特性id
s
-
XML
-指定的id
s 将是独一无二的。
- 代码分配
id
s do not必须是独一无二的
- 代码分配
id
s 可以(理论上)与XML
-指定的id
s.
- 这些相互矛盾的
id
如果查询正确,s并不重要(继续阅读).
何时(以及为何)发生冲突id
没关系
-
findViewById(int)
将通过视图层次结构递归地深度优先迭代从您指定的视图并返回第一个View
它找到匹配的id
.
- 只要没有分配代码
id
s 在 XML 定义之前分配id
在层次结构中,findViewById(R.id.somename)
将始终返回 XML 定义的视图,因此id
'd.
动态创建视图并分配ID
s
如果您选择保留对您的观点的引用,请务必将它们实例化为getApplicationContext()
并确保将每个引用设置为 nullonDestroy
。显然leaking the Activity
(在被销毁后挂在它上面)是浪费..:)
保留 XMLandroid:id
用于代码中
API 17 推出 View.generateViewId()
它生成一个唯一的 ID。(感谢 take-chances-make-changes 指出了这一点。)*
If your ViewGroup
无法通过 XML 定义(或者您不希望如此),您可以通过 XML 保留 id 以确保它保持唯一:
Here, 值/ids.xml定义一个自定义id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
然后,一旦创建了 ViewGroup 或 View,您就可以附加自定义 id
myViewGroup.setId(R.id.reservedNamedId);
冲突id
example
为了清楚起见,通过令人困惑的示例,让我们检查一下当存在以下情况时会发生什么:id
幕后冲突。
布局/mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
为了模拟冲突,假设我们分配了最新的构建R.id.placeholder
(@+id/placeholder
) an int
的价值 12
..
Next, 我的活动.java以编程方式定义一些添加视图(通过代码):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
So placeholder
以及我们的新产品之一TextView
两者都有一个id
共 12 个!但如果我们查询占位符的子视图,这并不是真正的问题:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*还不错