如何分配唯一的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?

  • Unity3D和Android Studio集成
  • 使用RemoteViews的Android 5+自定义通知XML布局,为ImageButton设置正确的图标色调
  • 使用XML在Android中创建3D翻转animation
  • ImageButton中的透明背景具有涟漪效应?
  • 旋转标记和移动像Uber Android的地图上的animation
  • 如何使重力“底部”在xml中的drawable上工作
  • Android视图上的阴影
  • 在android中使用JAXB(xjc)生成的类
  • 通过代码分配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,你都准备好了!