You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何编程将动态生成的EditText约束到CheckBox下方

问题原因

你的错误出在约束应用和控件添加的顺序反了:你先调用了constraintSet.applyTo(constraintLayout),之后才把newEditText添加到父布局里,ConstraintLayout在应用约束的时候还识别不到这个新增的EditText,约束自然不生效,控件就会默认跑到左上角。

修正步骤

  1. 先把newEditText添加到ConstraintLayout中,再克隆约束、设置约束、最后应用约束
  2. 建议给newEditText设置和原EditText一致的LayoutParams,不要只用setWidth/setHeight,避免样式和原有控件不一致
  3. 可以给newEditText的顶部约束加合适的间距,和原有布局间隔保持一致

修正后的核心代码

Button addNewToDo = findViewById(R.id.addNewToDo);
addNewToDo.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        CheckBox toDoCheckBox = new CheckBox(MainActivity.this);
        toDoCheckBox.setText(defaultEditText.getText().toString());
        toDoCheckBox.setTextSize(20);
        toDoCheckBox.setId(View.generateViewId());

        ConstraintLayout.LayoutParams originalParams = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();

        // 给CheckBox设置和原EditText一致的布局参数
        ConstraintLayout.LayoutParams checkBoxParams = new ConstraintLayout.LayoutParams(originalParams.width, originalParams.height);
        checkBoxParams.startToStart = originalParams.startToStart;
        checkBoxParams.leftToLeft = originalParams.leftToLeft;
        checkBoxParams.topToTop = originalParams.topToTop;
        checkBoxParams.leftMargin = originalParams.leftMargin;
        checkBoxParams.topMargin = originalParams.topMargin;
        constraintLayout.addView(toDoCheckBox, checkBoxParams);
        defaultEditText.setVisibility(View.INVISIBLE);

        // 创建新的EditText,先设置布局参数再添加到布局
        EditText newEditText = new EditText(MainActivity.this);
        newEditText.setId(View.generateViewId());
        // 复用原EditText的布局参数,保证宽高、边距等属性一致
        ConstraintLayout.LayoutParams newEtParams = new ConstraintLayout.LayoutParams(originalParams.width, originalParams.height);
        newEditText.setLayoutParams(newEtParams);
        // 先把EditText添加到父布局
        constraintLayout.addView(newEditText);

        // 再操作约束
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(constraintLayout);
        // 约束EditText到CheckBox下方,可自行调整margin大小
        constraintSet.connect(newEditText.getId(), ConstraintSet.START, toDoCheckBox.getId(), ConstraintSet.START);
        constraintSet.connect(newEditText.getId(), ConstraintSet.END, toDoCheckBox.getId(), ConstraintSet.END);
        constraintSet.connect(newEditText.getId(), ConstraintSet.TOP, toDoCheckBox.getId(), ConstraintSet.BOTTOM);
        constraintSet.setMargin(newEditText.getId(), ConstraintSet.TOP, originalParams.topMargin);
        // 约束按钮到EditText下方
        constraintSet.connect(addNewToDo.getId(), ConstraintSet.TOP, newEditText.getId(), ConstraintSet.BOTTOM);
        constraintSet.setMargin(addNewToDo.getId(), ConstraintSet.TOP, originalParams.topMargin);
        // 最后应用约束
        constraintSet.applyTo(constraintLayout);
    }
});

额外适配提示

因为你用的是嵌套在ScrollView里的ConstraintLayout,新增控件后如果内容超出屏幕高度,ScrollView会自动滚动,不需要额外处理。如果后续需要多次点击添加待办,记得每次点击后把newEditText赋值给全局的defaultEditText变量,下次点击就能复用当前的输入框逻辑。

内容的提问来源于stack exchange,提问作者mockingbird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:24:01