我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。
我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?
当前回答
只是对@phantomlimb的答案的补充,
而View.generateViewId()要求API级别>= 17, 该工具与所有API兼容。
根据现时的空气污染指数, 它决定天气是否使用系统API。
所以你可以使用ViewIdGenerator.generateViewId()和View.generateViewId() 同样的时间,不用担心得到相同的id
import java.util.concurrent.atomic.AtomicInteger;
import android.annotation.SuppressLint;
import android.os.Build;
import android.view.View;
/**
* {@link View#generateViewId()}要求API Level >= 17,而本工具类可兼容所有API Level
* <p>
* 自动判断当前API Level,并优先调用{@link View#generateViewId()},即使本工具类与{@link View#generateViewId()}
* 混用,也能保证生成的Id唯一
* <p>
* =============
* <p>
* while {@link View#generateViewId()} require API Level >= 17, this tool is compatibe with all API.
* <p>
* according to current API Level, it decide weather using system API or not.<br>
* so you can use {@link ViewIdGenerator#generateViewId()} and {@link View#generateViewId()} in the
* same time and don't worry about getting same id
*
* @author fantouchx@gmail.com
*/
public class ViewIdGenerator {
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
@SuppressLint("NewApi")
public static int generateViewId() {
if (Build.VERSION.SDK_INT < 17) {
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;
}
}
} else {
return View.generateViewId();
}
}
}
其他回答
只是对@phantomlimb的答案的补充,
而View.generateViewId()要求API级别>= 17, 该工具与所有API兼容。
根据现时的空气污染指数, 它决定天气是否使用系统API。
所以你可以使用ViewIdGenerator.generateViewId()和View.generateViewId() 同样的时间,不用担心得到相同的id
import java.util.concurrent.atomic.AtomicInteger;
import android.annotation.SuppressLint;
import android.os.Build;
import android.view.View;
/**
* {@link View#generateViewId()}要求API Level >= 17,而本工具类可兼容所有API Level
* <p>
* 自动判断当前API Level,并优先调用{@link View#generateViewId()},即使本工具类与{@link View#generateViewId()}
* 混用,也能保证生成的Id唯一
* <p>
* =============
* <p>
* while {@link View#generateViewId()} require API Level >= 17, this tool is compatibe with all API.
* <p>
* according to current API Level, it decide weather using system API or not.<br>
* so you can use {@link ViewIdGenerator#generateViewId()} and {@link View#generateViewId()} in the
* same time and don't worry about getting same id
*
* @author fantouchx@gmail.com
*/
public class ViewIdGenerator {
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
@SuppressLint("NewApi")
public static int generateViewId() {
if (Build.VERSION.SDK_INT < 17) {
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;
}
}
} else {
return View.generateViewId();
}
}
}
从API 17开始,View类有一个静态方法generateViewId()
生成适合setId(int)的值
根据查看文档
标识符在这个视图的层次结构中不必是唯一的。标识符应该是一个正数。
你可以使用任何你喜欢的正整数,但在这种情况下,可以有一些具有等效id的视图。如果你想在层次结构中搜索某个视图,调用带有一些关键对象的setTag可能会很方便。
从API级别17及以上,你可以调用:
然后使用View.setId(int)。
如果你的应用程序的目标低于API级别17,使用viewcompat.com generateviewid ()
你也可以在res/values中定义ids.xml。你可以在android的示例代码中看到一个确切的例子。
samples/ApiDemos/src/com/example/android/apis/RadioGroup1.java
samples/ApiDemp/res/values/ids.xml