java - Java 中约束布局宽度和高度作为根父级

标签 java android android-constraintlayout

这是我的代码,也许由于某种原因我无法将 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 时,我的 View 就会从屏幕上消失。

我在这里做错了什么?

When width and height are set to WRAP_CONTENT or MATCH_PARENT

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

最佳答案

您创建的所有 View 的 ID 均设置为 -1。因此,首先,您需要为它们设置新的不同 ID。要实现此目的,您可以使用 View 类中的静态方法:View.generateViewId(),如下所示:

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

其次,建议使用 documentation 中提到的 ConstraintSet,而不是使用 ConstraintLayout.LayoutParams 在运行时设置边距。 .

考虑到这些更改,代码应如下所示:

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

关于java - Java 中约束布局宽度和高度作为根父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800173/

相关文章:

JavaFX - 阻止用户在不使用 MODAL 的情况下更改阶段

android - 在 Recycler View 中膨胀

java - 由于 SIGSEGV 导致 JVM 崩溃

java - Java中的方法调用语法

java - 简单的 XML 框架 : Having an "inline like" behaviour for objects in ElementMap

android - 如何恢复 Android ListView 的位置?

java - ConstraintLayout 指南百分比动画

android - 我应该始终对所有内容使用 ConstraintLayout 吗?

java - 如何在constraintlayout中实现可滚动和放大缩小

java - JTree,始终显示 "edit mode"中的所有节点