0

我在这里尝试的是,当单击addNewToDo 按钮时,应该将defaultEditText视图从 editText 视图转换为具有与 defaultEditText 相同的约束的复选框视图,并且我使用 Constraint.LayoutParams 这样做非常成功。

但我还想要的是,在单击按钮的同时,应该使用与前一个相同的属性(editText)创建一个 newEditText并放置在以编程方式创建的复选框的底部以及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 约束到复选框?

仅供参考,我是在 ScrollView 中使用 ContraintLayout

4

1 回答 1

0

更新

您在代码中所做的不符合 Cheticamp 所述的规则: 通过 constraintSet 以编程方式设置约束会导致视图消失

考虑到这些,您应该立即constraintLayout.addView(newEditText);移动 newEditText.setId(View.generateViewId());

我认为这就是您的代码的所有问题。

旧答案(也解决了问题)

尝试这个:

//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();

我正在等待一些反馈。

于 2021-09-16T08:10:50.857 回答