如何分配唯一的ID来dynamic创build视图?

在我的应用程序中,我创buildViews – 在这种情况下,一个EditText – dynamic。 但是我添加的每个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); 

如果我指定一个随机值,我就怕发生冲突,我想不出任何可能产生冲突的方法。

请不要说我知道可以在res / values / ids.xml中定义一组固定的ID,但那不是我想要的! 我需要dynamic创buildID 我不知道有多less我需要。

那么有没有安全的方法来生成id?

Solutions Collecting From Web of "如何分配唯一的ID来dynamic创build视图?"

通过代码分配id (以编程方式)

  • 手动设置id使用someView.setId( INT );
  • int必须是正数,但在其他方面是任意的 – 它可以是任何你想要的(如果这是可怕的,请继续阅读)。
  • 例如,如果创build和编号代表项目的几个视图,您可以使用他们的项目编号。

通常我们做:

分配id –

 for(int i =0 ; i < yourIDcount ; i++){ yourView.setId(i); } 

获取id –

 View.findViewById(yourView.getId()); 

也,

API 17引入了View.generateViewId() ,它生成一个唯一的ID。

检查:

我怎样才能分配一个编程 的id和一个dynamic的android-assign-and-retrieve-id 。

有多种方法可以可靠地为您的Views生成ID。 有些可以用来在运行时dynamic生成ID,其他的可以用来静态定义一个固定数量的ID。 我会在这个答案中解决一些问题。


静态创build固定数量的ID

在名为ids.xml的res / values中创build一个新的xml文件,并添加types为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 只是改变types。


从API级别17+dynamic生成ID

在API级别17中, View类中添加了一个新的方法:

 int id = View.generateViewId(); 

有了它,你可以创build尽可能多的ID,你需要dynamic!


在API级别17之前dynamic生成ID

由于@Apoorvbuild议您可以在这里查看generateViewId()的源代码。 通过复制代码,我们甚至可以在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; } } } 

只要把它包括在一个帮助class,你都准备好了!