如何为动态创建的视图分配唯一ID?

时间:2014-07-18 10:32:56

标签: java android xml

在我的应用中,我正在动态创建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?

2 个答案:

答案 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-programmaticallyandroid-assign-and-retrieve-ids-dynamically

答案 1 :(得分:7)

有多种方法可以为Views可靠地生成ID。一些可用于在运行时动态生成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 +

动态生成ID

使用API​​级别17,View类添加了一种新方法:

int id = View.generateViewId();

有了它,您可以动态创建任意数量的ID!


在API级别17之前动态生成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;
        }
    }
}

只需将它包含在帮助程序类中即可完成设置!