在 XML 文件中,我们可以为视图分配一个 ID android:id="@+id/something",然后调用findViewById(),但是当以编程方式创建视图时,我如何分配一个 ID?
android:id="@+id/something"
findViewById()
我认为setId()与默认分配不同。setId()是额外的。
setId()
有人可以纠正我吗?
id
Androidid是一个整数,通常用于标识视图;这id可以通过 XML(如果可能)和代码(以编程方式)分配。这对于获取由 an 生成的idXML 定义的引用最有用(例如通过使用.)View``Inflater``setContentView
View``Inflater``setContentView
XML
android:id="@+id/
"
android:id
int
int``R.id.
gen/``R.java``R.id.
Preference``Preference``View
someView.setId(``);
findViewById(int)
View
id``findViewById(R.id.somename)``id
ID
ViewGroup
LinearLayout
android:id="@+id/placeholder"
使用 placeholder.findViewById(convenientInt); 查询这些子视图
引入的 API 17View.generateViewId()允许您生成唯一 ID。
View.generateViewId()
如果您选择保留对您的视图的引用,请 确保将它们实例化getApplicationContext()并确保将每个引用设置为 null in onDestroy。显然 泄漏 (在Activity被销毁后挂在上面)是浪费的.. :)
getApplicationContext()
onDestroy
Activity
引入的 API 17 View.generateViewId() 可生成唯一 ID。 (感谢 take-chances-make-changes 指出这一点。)*
如果您ViewGroup不能通过 XML 定义(或者您不希望这样),您可以通过 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幕后发生冲突时会发生什么。
布局/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..
R.id.placeholder
@+id/placeholder
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产品都有id12 个!但是,如果我们查询占位符的子视图,这并不是真正的问题:
placeholder
TextView
// 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);
*没那么糟糕