Java Android:以编程方式读取LayoutParams的视图ID
我试图做的是以编程方式创建一行带有约束视图的按钮。 我正在创建两个按钮,我希望它们彼此相邻,而不必对.xml文件做任何操作,因为按钮的数量可能因用户而异 我想使用类似(此代码是活动的一部分): 设置两个params2值不起作用,因为显然我无法真正访问button1的ID。 解决这个问题的有效办法是什么? 我读过并尝试过的东西:Java Android:以编程方式读取LayoutParams的视图ID,java,android,Java,Android,我试图做的是以编程方式创建一行带有约束视图的按钮。 我正在创建两个按钮,我希望它们彼此相邻,而不必对.xml文件做任何操作,因为按钮的数量可能因用户而异 我想使用类似(此代码是活动的一部分): 设置两个params2值不起作用,因为显然我无法真正访问button1的ID。 解决这个问题的有效办法是什么? 我读过并尝试过的东西: 使用标签而不是ID 使用所有已创建按钮的ArrayList作为活动的私有成员访问按钮 使用setId()为视图提供一些随机id(我已经选择) 使用类似的方法是可行的,
- 使用标签而不是ID
- 使用所有已创建按钮的ArrayList作为活动的私有成员访问按钮
- 使用setId()为视图提供一些随机id(我已经选择)
params2.topToTop = layout.findViewById(R.id.btn3).getId();
params2.leftToRight = layout.findViewById(R.id.btn3).getId();
但在所有其他情况下,我的btn2只是降落在btn1的顶部(或者更确切地说是在布局的左上角)
提前谢谢你 您可以使用以下方法以编程方式生成视图id:
private static final AtomicInteger nextGeneratedId = new AtomicInteger(10000);
public static int generateViewId() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
for (;;) {
final int result = nextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 10000; // Roll over to 10000, not 0.
if (nextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
} else {
return View.generateViewId();
}
}
private static final AtomicInteger nextGeneratedId=new AtomicInteger(10000);
公共静态int generateViewId(){
if(Build.VERSION.SDK\u INT0x00FFFFFF)newValue=10000;//滚动到10000,而不是0。
if(nextGenerateId.compareAndSet(结果,新值)){
返回结果;
}
}
}否则{
return View.generateView();
}
}
为您创建的按钮调用
.setId(generateId)
。您需要为创建的按钮设置一个id,如btn1.setId(1);btn2.setId(2)或您想要的任何号码
private static final AtomicInteger nextGeneratedId = new AtomicInteger(10000);
public static int generateViewId() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
for (;;) {
final int result = nextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 10000; // Roll over to 10000, not 0.
if (nextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
} else {
return View.generateViewId();
}
}