android 中使用View.setId(int id),如何避免id冲突呢?
2015-07-04 10:25
543 查看
在项目开发中,有时候项目开发过程会需要,我们在代码中使用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());
}
}
里边还提到了一些其他的方法,但是我在项目中是用的上述方法。
避免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 Intent Action 大全
- 教你来彻底理解ldpi、mdpi、hdpi、xhdpi、xxhdpi
- Android 中文件类型与MIME的匹配表
- IntelliJ IDEA 14.1.4 导入android项目报错解决方法.md
- Android handler
- android耗时任务_AsyncTask
- Android设置横竖屏
- android mapView
- Android SQLite
- 图片异步加载框架 Android-Universal-Image-Loader
- java.lang.ClassNotFoundException: android.view.LinearLaout
- Android webView 缓存 Cache + HTML5离线功能 解决
- Android自定义搜索框(EditText)的搜索功能实现,过滤ListView
- Asynctask解析以及注意事项
- Android获取短信验证码的实现方法
- Android中 dp,px,dpi三者之间的关系
- Android蓝牙开发的一点总结
- Android进阶学习总结-自定义ViewGroup和属性
- 【Android基础篇】Activity的生命周期
- android 获取屏幕分辨率