Answers:
id
概述Android id
是通常用于标识视图的整数;这id
可以通过XML(如果可能),并且经由代码分配(编程)的id
是获得用于XML定义的引用最有用的View
由生成S- Inflater
(诸如通过使用setContentView
)。
id
通过分配XML
android:id="@+id/
somename "
到您的视图。android:id
将为代码分配一个唯一 int
的代码。android:id
的int
值R.id.
。int
可能会因版本而异,因此切勿从gen/
package.name/ 复制IDR.java
,只需使用“ R.id.
somename”即可。id
分配给。)Preference
Preference
View
id
通过代码分配(以编程方式)id
使用someView.setId(
int 手动设置);
int
必须是积极的,但另有arbitrary-它可以是任何你想要的(请继续阅读,如果这是可怕的。)id
小号XML
-assigned id
是唯一的。id
就做不必须是唯一的id
s(理论上)可以与XML
-assigned id
的冲突。id
如果正确查询(保持阅读),则这些冲突s无关紧要。id
无关紧要findViewById(int)
将从指定的View递归遍历视图层次结构的深度优先,并返回View
它找到的第一个具有match的对象id
。id
的XML定义之前没有分配代码分配id
,findViewById(R.id.somename)
就将始终返回XML定义的视图id
。ID
sViewGroup
带id
。LinearLayout
带android:id="@+id/placeholder"
。ViewGroup
用View
秒。id
为每个视图分配任何方便的。使用placeholder.findViewById(convenientInt);查询这些子视图;
引入了API 17 View.generateViewId()
,使您可以生成唯一的ID。
如果选择保留对视图的引用,请确保使用实例化它们,getApplicationContext()
并确保在中将每个引用设置为null onDestroy
。显然,泄漏的Activity
(挂到它之后被销毁)是一种浪费.. :)
android:id
以在代码中使用引入了API 17 View.generateViewId()
,该API 生成唯一的ID。(感谢您指出这一点。)*
如果您ViewGroup
不能通过XML定义您的ID(或者您不希望这样),则可以通过XML保留ID以确保其唯一性:
在这里,values / 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
例子为了清楚起见,通过混淆示例,让我们检查id
在幕后发生冲突时会发生什么。
layout / 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
)分配了。int
值 12
。
接下来,MyActivity.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);
}
因此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);
*还不错
findViewById
是进行深度优先的探索,因此“只要在层次结构中XML定义的ID上方没有分配代码分配的ID”在技术上就不正确;它是“之前”而不是“之上”。
ids.xml
。对于真正任意的ID,请使用View.generateViewId()
(API 17)。(如果我错过了,请澄清您的观点。)
PreferenceDialogFragmentCompat
它,好像ids from R.id
与视图层次结构不匹配。这样,我无法通过ID查找视图。
是的,您可以setId(value)
在任何视图中使用所需的任何(正)整数值进行调用,然后使用在父容器中找到它findViewById(value)
。请注意,setId()
对于不同的同级视图使用相同的值进行调用是有效的,但findViewById()
只会返回第一个。
findViewById
出于性能方面的考虑,拜访一位已知的祖先是个好主意,但不能保证如果有一个具有正确ID的孩子,它将找到一个直系孩子。