通过 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中的“toStartOf”和“toTopOf”?
来自 ConstraintSet 的 clone 和 applyTo 使应用程序崩溃
如何使用 ConstraintSet 设置类似 app:layout_constraintBottom_toBottomOf 的内容?