在我的应用中,我正在动态创建Views
- 在本例中为EditText
。但我添加的每个View
都需要具有唯一ID。
EditText editText = new EditText(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
editText.setLayoutParams(params);
// Which value am I supposed to use here?
editText.setId(value);
layout.addView(editText);
如果我分配一个随机值,我害怕冲突,我想不出有任何方法可以生成id而不会发生冲突。
请注意,我不知道可以在res / values / ids.xml中定义一组固定的ID,但这不是我想要的!我需要动态创建ID!我不知道我需要多少。
那么有没有安全的方法来生成ID?
答案 0 :(得分:9)
id
id
int someView.setId(
);
int
必须是正面的,但在其他方面是任意的 - 它可以是你想要的任何东西(如果这是可怕的话,请继续阅读。)分配ID -
for(int i =0 ; i < yourIDcount ; i++){
yourView.setId(i);
}
获取ID -
View.findViewById(yourView.getId());
此外,
API 17
引入View.generateViewId()
,生成唯一ID。
检查:
how-can-i-assign-an-id-to-a-view-programmatically和android-assign-and-retrieve-ids-dynamically。
答案 1 :(得分:7)
有多种方法可以为Views
可靠地生成ID。一些可用于在运行时动态生成id,另一些可用于静态定义固定数量的id。我将在这个答案中讨论一些解决方案。
在名为ids.xml的res / values中创建一个新的xml文件,并添加类型为id的元素:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="name" type="id" /> <!-- Creates the id R.id.name -->
<item name="example" type="id" /> <!-- Creates the id R.id.example -->
</resources>
您也可以为其他资源生成ID!只需更改类型。
使用API级别17,View
类添加了一种新方法:
int id = View.generateViewId();
有了它,您可以动态创建任意数量的ID!
正如@Apoorv建议您可以查看generateViewId()
here的源代码。通过复制代码,我们甚至可以在API级别17之前使用此方法:
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
public static int generateViewId() {
for (; ; ) {
final int result = sNextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
if (sNextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
}
只需将它包含在帮助程序类中即可完成设置!