我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
当前回答
为了动态生成视图Id表单API 17使用
generateViewId ()
这将生成一个适合在setId(int)中使用的值。该值不会与aapt在构建时为r.d ID生成的ID值冲突。
其他回答
您可以使用xml资源文件定义稍后将在r.d ID类中使用的ID,并让Android SDK在编译时设置实际的惟一值。
res/values/ids.xml
<item name="my_edit_text_1" type="id"/>
<item name="my_button_1" type="id"/>
<item name="my_time_picker_1" type="id"/>
在代码中使用它:
myEditTextView.setId(R.id.my_edit_text_1);
根据查看文档
标识符在这个视图的层次结构中不必是唯一的。标识符应该是一个正数。
你可以使用任何你喜欢的正整数,但在这种情况下,可以有一些具有等效id的视图。如果你想在层次结构中搜索某个视图,调用带有一些关键对象的setTag可能会很方便。
Compat库现在还支持API级别之前的generateViewId()方法。
只要确保使用27.1.0以上版本的Compat库即可
例如,在您的构建中。Gradle文件,放入:
实现“com.android.support: appcompat-v7:27.1.1
然后你可以简单地使用来自ViewCompat类的generateViewId()而不是View类,如下所示:
//将分配唯一的ID myView。id = ViewCompat.generateViewId()
编码愉快!
从API级别17及以上,你可以调用:
然后使用View.setId(int)。
如果你的应用程序的目标低于API级别17,使用viewcompat.com generateviewid ()
受到@dilettante answer的启发,下面是我在kotlin中作为扩展函数的解决方案:
/* sets a valid id that isn't in use */
fun View.findAndSetFirstValidId() {
var i: Int
do {
i = Random.nextInt()
} while (findViewById<View>(i) != null)
id = i
}