将 Java 中的布局宽度和高度限制为根父级

Constraint Layout Width and Height in Java as Root Parent

这是我的代码,可能由于某些原因我无法将 TextView 和 Button 放在中间。我的代码有什么问题?

ConstraintSet constraintSet = new ConstraintSet();
        int parentId = ConstraintSet.PARENT_ID;

    //parent
    ConstraintLayout orderProcessedLayout = new ConstraintLayout(getApplicationContext());
    int constraintId = orderProcessedLayout.getId();

    //Text View
    TextView thanksTextView = new TextView(this);
    int textViewId = thanksTextView.getId();
    orderProcessedLayout.addView(thanksTextView, 0);

    //ButtonView
    Button reOrderButton = new Button(this);
    int buttonViewId = reOrderButton.getId();
    orderProcessedLayout.addView(reOrderButton, 1);

    /*Setting Views Attributes*/
    //Layout View
    //setting constraints
    constraintSet.clone(orderProcessedLayout);  //cloning ConstraintSet
    ConstraintLayout.LayoutParams constraintParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
    constraintParams.setMargins(16,16,16,16);
    orderProcessedLayout.setLayoutParams(constraintParams);
    //todo set the width and height to be match constraint

    //Text View
    CharSequence thanksText = "THANK YOU";
    thanksTextView.setText(thanksText);
    thanksTextView.setTextColor(Color.BLUE);
    thanksTextView.setHighlightColor(Color.BLACK);

    //setting constraints
    constraintSet.connect(textViewId, ConstraintSet.START, constraintId, ConstraintSet.START);
    constraintSet.connect(textViewId, ConstraintSet.END, constraintId, ConstraintSet.END);
    constraintSet.connect(textViewId, ConstraintSet.TOP, constraintId, ConstraintSet.TOP);
    constraintSet.connect(textViewId, ConstraintSet.BOTTOM, constraintId, ConstraintSet.BOTTOM);

    //Button View
    CharSequence reOrderText = "ORDER AGAIN";
    reOrderButton.setText(reOrderText);

    //Button Action
    reOrderButton.setClickable(true);
    reOrderButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            orderCancelled(null);
        }
    });

    //setting constraints
    constraintSet.connect(buttonViewId, ConstraintSet.START, constraintId, ConstraintSet.START);
    constraintSet.connect(buttonViewId, ConstraintSet.END, constraintId, ConstraintSet.END);
    constraintSet.connect(buttonViewId, ConstraintSet.BOTTOM, constraintId, ConstraintSet.BOTTOM);
    constraintSet.connect(buttonViewId, ConstraintSet.TOP, textViewId, ConstraintSet.BOTTOM);

    //applying everything
    constraintSet.applyTo(orderProcessedLayout);

当我将宽度和高度设置为 MATCH_CONSTRAINT 或 MATCH_CONSTRAINT_SPREAD 时,我的视图就从屏幕上消失了。

我做错了什么?

您是否有解决方案来更正设计使其看起来像

您创建的所有视图都将其 ID 设置为 -1。所以首先,您需要为它们设置新的不同 ID。为此,您可以使用 View class 中的静态方法:View.generateViewId() 如下所示:

TextView thanksTextView = new TextView(this);
thanksTextView.setId(View.generateViewId());
int textViewId = thanksTextView.getId();

其次,建议使用 ConstraintSet 在运行时设置边距,而不是使用 ConstraintLayout.LayoutParams,如 documentation.

中所述

考虑到这些变化,代码应如下所示:

ConstraintSet constraintSet = new ConstraintSet();

//parent
ConstraintLayout orderProcessedLayout = new ConstraintLayout(getApplicationContext());
orderProcessedLayout.setId(ConstraintSet.PARENT_ID);
int constraintId = orderProcessedLayout.getId();

//Text View
TextView thanksTextView = new TextView(this);
thanksTextView.setId(View.generateViewId());
int textViewId = thanksTextView.getId();
orderProcessedLayout.addView(thanksTextView, 0);

//ButtonView
Button reOrderButton = new Button(this);
reOrderButton.setId(View.generateViewId());
int buttonViewId = reOrderButton.getId();
orderProcessedLayout.addView(reOrderButton, 1);

/*Setting Views Attributes*/
//Layout View
//setting constraints
constraintSet.clone(orderProcessedLayout);  //cloning ConstraintSet
constraintSet.setMargin(constraintId, ConstraintSet.START, 16);
constraintSet.setMargin(constraintId, ConstraintSet.END, 16);
constraintSet.setMargin(constraintId, ConstraintSet.TOP, 16);
constraintSet.setMargin(constraintId, ConstraintSet.BOTTOM, 16);

//Text View
CharSequence thanksText = "THANK YOU";
thanksTextView.setText(thanksText);
thanksTextView.setTextColor(Color.BLUE);
thanksTextView.setHighlightColor(Color.BLACK);

//setting constraints
constraintSet.connect(textViewId, ConstraintSet.START, constraintId, ConstraintSet.START);
constraintSet.connect(textViewId, ConstraintSet.END, constraintId, ConstraintSet.END);
constraintSet.connect(textViewId, ConstraintSet.TOP, constraintId, ConstraintSet.TOP);
constraintSet.connect(textViewId, ConstraintSet.BOTTOM, constraintId, ConstraintSet.BOTTOM);

//Button View
CharSequence reOrderText = "ORDER AGAIN";
reOrderButton.setText(reOrderText);

//Button Action
reOrderButton.setClickable(true);
reOrderButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        orderCancelled(null);
    }
});

//setting constraints
constraintSet.connect(buttonViewId, ConstraintSet.START, textViewId, ConstraintSet.START);
constraintSet.connect(buttonViewId, ConstraintSet.TOP, textViewId, ConstraintSet.BOTTOM);

//applying everything
constraintSet.applyTo(orderProcessedLayout);