【问题标题】:Android: Programmatically reading view IDs for LayoutParamsAndroid:以编程方式读取 LayoutParams 的视图 ID
【发布时间】:2018-02-23 23:51:27
【问题描述】:

我想要做的是以编程方式创建一行带有约束视图的按钮。 我正在创建两个按钮,我想让它们彼此相邻而不对 .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 的顶部(或者更确切地说是在布局的左上角)

提前谢谢你!

【问题讨论】:

  • 你需要为创建的按钮设置一个id,比如btn1.setId(1); btn2.setId(2) 或任何你想要的数字

标签: java android


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多