我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
当前回答
我的选择:
// Method that could us an unique id
int getUniqueId(){
return (int)
SystemClock.currentThreadTimeMillis();
}
其他回答
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);
}
受到@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
}
为了动态生成视图Id表单API 17使用
generateViewId ()
这将生成一个适合在setId(int)中使用的值。该值不会与aapt在构建时为r.d ID生成的ID值冲突。
Compat库现在还支持API级别之前的generateViewId()方法。
只要确保使用27.1.0以上版本的Compat库即可
例如,在您的构建中。Gradle文件,放入:
实现“com.android.support: appcompat-v7:27.1.1
然后你可以简单地使用来自ViewCompat类的generateViewId()而不是View类,如下所示:
//将分配唯一的ID myView。id = ViewCompat.generateViewId()
编码愉快!
int fID;
do {
fID = Tools.generateViewId();
} while (findViewById(fID) != null);
view.setId(fID);
...
public class Tools {
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
public static int generateViewId() {
if (Build.VERSION.SDK_INT < 17) {
for (;;) {
final int result = sNextGeneratedId.get();
int newValue = result + 1;
if (newValue > 0x00FFFFFF)
newValue = 1; // Roll over to 1, not 0.
if (sNextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
} else {
return View.generateViewId();
}
}
}