在 ConstraintLayout 中动态更改视图的约束
Dynamically changing the constraint of a view in ConstraintLayout
我正在尝试通过按下按钮来更改 ConstraintLayout 中视图的左约束(准则)。我的布局 XML(相关部分)如下所示:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:indeterminate="true"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/guideline_bcrumbs_bottom"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="@+id/guideline_group_left"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<android.support.constraint.Guideline
android:id="@+id/guideline_group_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.2"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="205dp"/>
<android.support.constraint.Guideline
android:id="@+id/guideline_category_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.45"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="461dp"/>
这里,我想把进度条的constraintLeft_toLeftOf
属性从guideline_group_left
动态的改成guideline_category_left
。有没有办法做到这一点?
编辑:
我添加了以下几行来调整约束(基于此link:http://www.techotopia.com/index.php/Managing_Constraints_using_ConstraintSet)
ConstraintSet set = new ConstraintSet();
set.connect(mProgressBar.getId(), ConstraintSet.LEFT, R.id.guideline_category_left, ConstraintSet.LEFT, 0);
set.connect(mProgressBar.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
set.applyTo(mConstraintLayout);
但是,经过这些更改后,进度条根本不显示了。我觉得我很接近,但可能遗漏了什么。
编辑 2
我意识到我忘记添加以下行,这就是它不起作用的原因。
set.clone(mConstraintLayout);
解决方案:
我设法用以下代码行解决了我的问题,如果其他人遇到类似问题,它可能会对他们有所帮助。
ConstraintSet set = new ConstraintSet();
set.clone(mConstraintLayout);
set.connect(mProgressBar.getId(), ConstraintSet.LEFT, R.id.guideline_category_left, ConstraintSet.LEFT, 0);
set.connect(mProgressBar.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
set.applyTo(mConstraintLayout);
我正在尝试通过按下按钮来更改 ConstraintLayout 中视图的左约束(准则)。我的布局 XML(相关部分)如下所示:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:indeterminate="true"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/guideline_bcrumbs_bottom"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="@+id/guideline_group_left"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<android.support.constraint.Guideline
android:id="@+id/guideline_group_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.2"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="205dp"/>
<android.support.constraint.Guideline
android:id="@+id/guideline_category_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.45"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="461dp"/>
这里,我想把进度条的constraintLeft_toLeftOf
属性从guideline_group_left
动态的改成guideline_category_left
。有没有办法做到这一点?
编辑:
我添加了以下几行来调整约束(基于此link:http://www.techotopia.com/index.php/Managing_Constraints_using_ConstraintSet)
ConstraintSet set = new ConstraintSet();
set.connect(mProgressBar.getId(), ConstraintSet.LEFT, R.id.guideline_category_left, ConstraintSet.LEFT, 0);
set.connect(mProgressBar.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
set.applyTo(mConstraintLayout);
但是,经过这些更改后,进度条根本不显示了。我觉得我很接近,但可能遗漏了什么。
编辑 2
我意识到我忘记添加以下行,这就是它不起作用的原因。
set.clone(mConstraintLayout);
解决方案:
我设法用以下代码行解决了我的问题,如果其他人遇到类似问题,它可能会对他们有所帮助。
ConstraintSet set = new ConstraintSet();
set.clone(mConstraintLayout);
set.connect(mProgressBar.getId(), ConstraintSet.LEFT, R.id.guideline_category_left, ConstraintSet.LEFT, 0);
set.connect(mProgressBar.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
set.applyTo(mConstraintLayout);