通过 constraintSet 以编程方式设置约束会导致视图消失

Posted

技术标签:

【中文标题】通过 constraintSet 以编程方式设置约束会导致视图消失【英文标题】:Setting constraints programmatically via constraintSet causes views to disappear 【发布时间】:2020-07-01 01:51:55 【问题描述】:

每当我连接两个小部件时,起始元素将不再显示。 不幸的是,我不知道这个问题的原因是什么。 ConstraintLayout myLayout 已经在另一个布局中膨胀。

ConstraintLayout myLayout= getActivity().findViewById(R.id.myID);
myLayout.removeAllViews();

ConstraintSet constraintSet = new ConstraintSet();

CheckBox cb = new CheckBox(myLayout.getContext());
cb.setText("CHECKBOX");
cb.setId(View.generateViewId());

myLayout.addView(cb);

constraintSet.connect(cb.getId(),ConstraintSet.END,myLayout.getId(),ConstraintSet.END);
constraintSet.connect(cb.getId(),ConstraintSet.TOP,myLayout.getId(),ConstraintSet.TOP);

constraintSet.applyTo(myLayout);

【问题讨论】:

嗨,请为每个轴设置至少 1 个约束,这里您已经定义了 END ,同时定义了 TOP 或/和 BOTTOM。 我已经添加了它,但是它不能解决问题(和/或相关)。 【参考方案1】:

设置约束后显示,像这样

    ConstraintLayout myLayout= findViewById(R.id.lo1);
    myLayout.removeAllViews();

    ConstraintSet constraintSet = new ConstraintSet();

    CheckBox cb = new CheckBox(myLayout.getContext());
    cb.setText("CHECKBOX");
    cb.setId(View.generateViewId());


    constraintSet.connect(cb.getId(),ConstraintSet.END,myLayout.getId(),ConstraintSet.END);
    constraintSet.connect(cb.getId(),ConstraintSet.TOP,myLayout.getId(),ConstraintSet.TOP);

    constraintSet.applyTo(myLayout);
    myLayout.addView(cb);

【讨论】:

【参考方案2】:

我没有关注您的两种布局以及它们如何交互,但通常您会添加一个视图并将其连接起来,如下所示:

    创建文本视图 将视图添加到布局中 创建约束集 将布局约束(和 ID)克隆到 ConstraintSet cs.clone(layout) 建立联系 将 ConstraintSet 应用于布局:constraintSet.applyTo(myLayout)

此外,由于您要从 myLayout 中删除所有视图,并且不向其中添加任何内容,因此您的布局将是空的。修复这个然后上面的内容。

【讨论】:

以上是关于通过 constraintSet 以编程方式设置约束会导致视图消失的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式修改 ConstraintSet 链未按预期工作

什么相当于ConstraintSet中的“toStartOf”和“toTopOf”?

在 iOS 中以编程方式对 UITableView 的约束

使用 ConstraintSet 时测量的布局大小为零

来自 ConstraintSet 的 clone 和 applyTo 使应用程序崩溃

如何使用 ConstraintSet 设置类似 app:layout_constraintBottom_toBottomOf 的内容?