我要做的是以编程方式创建一行带有约束视图的按钮。 我正在创建两个按钮,我想让它们彼此相邻而不对.xml文件做任何事情,因为按钮的数量可能因用户而异。
我想使用类似的东西(此代码是Activity的一部分):
ConstraintLayout layout = findViewById(R.id.layout);
Button btn1 = new Button(this);
Button btn2 = new Button(this);
ConstraintLayout.LayoutParams params1 = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,ConstraintLayout.LayoutParams.WRAP_CONTENT);
ConstraintLayout.LayoutParams params2 = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,ConstraintLayout.LayoutParams.WRAP_CONTENT);
layout.addView(btn1, 1, params1);
params2.topToTop = btn1.getId();
params2.leftToRight = btn1.getId();
layout.addView(btn2, 2, params2);
设置两个params2值不起作用,因为显然我无法真正访问button1的ID。 什么是一个有效的解决方案? 我读过并试过的东西:
使用类似的东西,因为我在xml文件中预定了btn3:
params2.topToTop = layout.findViewById(R.id.btn3).getId();
params2.leftToRight = layout.findViewById(R.id.btn3).getId();
但是在所有其他情况下,我的btn2只是位于btn1之上(或者更确切地说是位于布局的左上角)
提前谢谢!
答案 0 :(得分:1)
您可以使用以下方法以编程方式生成视图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();
}
}
为您创建的按钮致电.setId(generatedId)
。