Android中如何编程将动态生成的EditText约束到CheckBox下方
问题原因
你的错误出在约束应用和控件添加的顺序反了:你先调用了constraintSet.applyTo(constraintLayout),之后才把newEditText添加到父布局里,ConstraintLayout在应用约束的时候还识别不到这个新增的EditText,约束自然不生效,控件就会默认跑到左上角。
修正步骤
- 先把
newEditText添加到ConstraintLayout中,再克隆约束、设置约束、最后应用约束 - 建议给newEditText设置和原EditText一致的LayoutParams,不要只用
setWidth/setHeight,避免样式和原有控件不一致 - 可以给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
相关产品推荐
相关产品推荐

