在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的文本区域(高度/宽度)

多个ListViews在android中以编程方式创建

在android中以编程方式创建视图时如何传递AttributeSet

如何在android中以编程方式创建多个列表

在 Android 中以编程方式创建的多个文本视图的单个 onclick 侦听器

在线性布局中以编程方式编辑视图