在android中以编程方式将EditText视图约束到复选框?
Posted
技术标签:
【中文标题】在android中以编程方式将EditText视图约束到复选框?【英文标题】:Constraining a EditText view to a checkBox programmatically in android? 【发布时间】:2021-11-11 03:53:39 【问题描述】:我在这里尝试的是,当单击 addNewToDo 按钮 时,应该将 defaultEditText 视图从 editText 视图转换为具有与defaultEditText,我使用 Constraint.LayoutParams 非常成功。
但我还想要的是,在单击按钮的同时,应该创建一个与前一个具有相同属性的newEditText(editText)并放置在底部以编程方式创建的复选框以及 addNewToDo 按钮应位于 newEditText 下方
以下代码成功,
使用预期属性创建复选框。 创建一个具有正确宽度和高度的新 editText 视图。 约束新创建的editText下方的按钮。
失败了,
在已创建的复选框下方约束 newEditText 视图
我得到的输出是,
newEditText 被放置在 UI 的左上角,我了解到如果没有正确约束视图会被放置在那里
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 params = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();
ConstraintLayout.LayoutParams newParams = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT,
ConstraintLayout.LayoutParams.MATCH_PARENT
);
newParams.width = params.width;
newParams.height = params.height;
newParams.startToStart = params.startToStart;
newParams.leftToLeft = params.leftToLeft;
newParams.topToTop = params.topToTop;
newParams.leftMargin = params.leftMargin;
newParams.topMargin = params.topMargin;
constraintLayout.addView(toDoCheckBox,-1,newParams);
defaultEditText.setVisibility(View.INVISIBLE);
//creating a new editText
EditText newEditText = new EditText(MainActivity.this);
newEditText.setWidth(defaultEditText.getWidth());
newEditText.setHeight(defaultEditText.getHeight());
newEditText.setId(View.generateViewId());
constraintSet.clone(constraintLayout);
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.connect(addNewToDo.getId(),ConstraintSet.TOP,newEditText.getId(),ConstraintSet.BOTTOM);
constraintSet.applyTo(constraintLayout);
constraintLayout.addView(newEditText);
);
如何将newEditText约束到checkBox?
仅供参考,我是在 ScrollView 中使用 ContraintLayout
【问题讨论】:
【参考方案1】:更新
您在代码中所做的不符合 Cheticamp 规定的规则: Setting constraints programmatically via constraintSet causes views to disappear.
考虑到这些,您应该在 newEditText.setId(View.generateViewId());
之后移动constraintLayout.addView(newEditText);
我认为这就是您的代码的全部问题。
旧答案(也解决了问题)
试试这个:
//creating a new editText
EditText newEditText = new EditText(MainActivity.this);
newEditText.setWidth(defaultEditText.getWidth());
newEditText.setHeight(defaultEditText.getHeight());
newEditText.setId(View.generateViewId());
ConstraintLayout.LayoutParams lp =
new ConstraintLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
lp.topToBottom = toDoCheckBox.getId();
newEditText.setLayoutParams(lp);
constraintLayout.addView(newEditText);
它应该工作。如果是这样,您可以添加其余的约束:
lp.startToStart = toDoCheckBox.getId();
我正在等待一些反馈。
【讨论】:
您的解决方案运行良好,但我仍然不明白为什么我创建的 costraintSet 没有将 editText 动态约束到复选框,因为它也约束 startToStart、endToEnd 和 TopToBottom,供参考我问的问题是我创建的约束集。 @mockingbird 我以这种方式解决了它,因为这是我一直在使用的。在您回答之前,不知道还有另一种设置约束的方法。我试过按照你的方式做,发现你的逻辑有问题。查看更新后的答案。 @mockingbird 怎么样了? 是的,很好,我没有检查你的解决方案是否有效,我会试一试,我会给你反馈。以上是关于在android中以编程方式将EditText视图约束到复选框?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中以编程方式查找TextView的文本区域(高度/宽度)
在android中以编程方式创建视图时如何传递AttributeSet