Android:以编程方式读取LayoutParams的视图ID

时间:2018-02-23 15:46:35

标签: java android

我要做的是以编程方式创建一行带有约束视图的按钮。 我正在创建两个按钮,我想让它们彼此相邻而不对.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。 什么是一个有效的解决方案? 我读过并试过的东西:

  • 使用标签代替ID
  • 使用所有创建按钮的ArrayList作为Activity的私有成员访问按钮
  • 使用setId()
  • 为视图提供一些随机ID(我已选择)

使用类似的东西,因为我在xml文件中预定了btn3:

params2.topToTop = layout.findViewById(R.id.btn3).getId();
params2.leftToRight = layout.findViewById(R.id.btn3).getId();

但是在所有其他情况下,我的btn2只是位于btn1之上(或者更确切地说是位于布局的左上角)

提前谢谢!

1 个答案:

答案 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)