我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。

我如何使用TextView。setId (int id) ?我要用什么样的整数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);

其他回答

受到@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
}

Compat库现在还支持API级别之前的generateViewId()方法。

只要确保使用27.1.0以上版本的Compat库即可

例如,在您的构建中。Gradle文件,放入:

实现“com.android.support: appcompat-v7:27.1.1

然后你可以简单地使用来自ViewCompat类的generateViewId()而不是View类,如下所示:

//将分配唯一的ID myView。id = ViewCompat.generateViewId()

编码愉快!

您可以使用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);

我的选择:

// Method that could us an unique id

    int getUniqueId(){
        return (int)    
                SystemClock.currentThreadTimeMillis();    
    }

根据查看文档

标识符在这个视图的层次结构中不必是唯一的。标识符应该是一个正数。

你可以使用任何你喜欢的正整数,但在这种情况下,可以有一些具有等效id的视图。如果你想在层次结构中搜索某个视图,调用带有一些关键对象的setTag可能会很方便。