android 中使用View.setId(int id),如何避免id冲突呢?
来源:互联网 发布:visual studio 开发js 编辑:程序博客网 时间:2024/04/29 06:33
在项目开发中,有时候项目开发过程会需要,我们在代码中使用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());
}
}
里边还提到了一些其他的方法,但是我在项目中是用的上述方法。
- android 中使用View.setId(int id),如何避免id冲突呢?
- Android动态setId,避免id重复
- Android - 动态设置自定义View的id - setId
- Android 动态设置View的id——setId
- Android如何正确使用View.setId
- Android中View.setId()
- Android 如何解决代码中view的setId红线问题
- android在代码中为new出的控件设置ID及setId()异常
- android 中View.setID,与getID
- js省市级联--避免id冲突
- 如何避免android layout.xml 布局文件中重名id的错误
- android中id与+id
- 如何从Faces Context中得到当前的view id?
- 如何在fragment中获取自定义view的控件id
- 如何在fragment中获取自定义view的控件id
- Android 不同View ID相同
- 如何获取wordpress分类目录的ID呢
- Android中View的id(个人备忘)
- Java单例模式复习(三)
- 2015070402 - EffactiveJava笔记 - 第56条 遵守普遍命名规范(1)
- C++标准库和标准模板库
- Web App开发入门
- Android Intent Action 大全
- android 中使用View.setId(int id),如何避免id冲突呢?
- 解释器模式
- 定制jQuery File Upload为微博式单文件上传
- .NetFrameWork介绍
- rotate-list
- LeetCode Same Tree
- Apache之火狐的卸载
- UltraEdit多种语法高亮工具
- solr中的dih tips