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

我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?


当前回答

public String TAG() {
    return this.getClass().getSimpleName();
}

private AtomicInteger lastFldId = null;

public int generateViewId(){

    if(lastFldId == null) {
        int maxFld = 0;
        String fldName = "";
        Field[] flds = R.id.class.getDeclaredFields();
        R.id inst = new R.id();

        for (int i = 0; i < flds.length; i++) {
            Field fld = flds[i];

            try {
                int value = fld.getInt(inst);

                if (value > maxFld) {
                    maxFld = value;
                    fldName = fld.getName();
                }
            } catch (IllegalAccessException e) {
                Log.e(TAG(), "error getting value for \'"+ fld.getName() + "\' " + e.toString());
            }
        }
        Log.d(TAG(), "maxId="+maxFld +"  name="+fldName);
        lastFldId = new AtomicInteger(maxFld);
    }

    return lastFldId.addAndGet(1);
}

其他回答

为了动态生成视图Id表单API 17使用

generateViewId ()

这将生成一个适合在setId(int)中使用的值。该值不会与aapt在构建时为r.d ID生成的ID值冲突。

从API 17开始,View类有一个静态方法generateViewId()

生成适合setId(int)的值

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

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

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

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

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

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

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

编码愉快!

我的选择:

// Method that could us an unique id

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