android 中使用View.setId(int id),如何避免id冲突呢?

在项目开发中,有时候项目开发过程会需要,我们在代码中使用for循环创建View对象,并且每个View都需要setId(int id),这时候如何

避免id不和xml中冲突呢?在stackoverflow的

http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts  

 看到这篇文章很好的解决了上述的问题。

根据View的doc描述:

The identifier does not have to be unique in this view's hierarchy. The identifier should be a positive number.

每个View都必须有一个唯一的标识符,这个标识符是一个正整数。在上述的例子中可能会遇到重复id的情况。

在sdk17 以上使用myView.setId(View.generateViewId()); 在低于17 的版本中我们需要自己去写一些方法,我们

可以看看View.java的内部实现。然后把这个方法抽取出来写到在即的Utils.java,具体实现如下:

private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

/**
* Generate a value suitable for use in {@link #setId(int)}.
* This value will not collide with ID values generated at build time by aapt for R.id.
*
* @return a generated ID value
*/
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;
       }
   }
}

ID大于0x00FFFFFF的已经在xml中定义到了,容易发生冲突。

在调用的地方可以这样使用:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
       myView.setId(Utils.generateViewId());
   } else {
       myView.setId(View.generateViewId());
   }

}

里边还提到了一些其他的方法,但是我在项目中是用的上述方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值