I have the following simplified XML layout with one constraint layout, two textviews and one switch:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@ id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Demo"
app:layout_constraintEnd_toStartOf="@id/innerConstraintLayout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.SwitchCompat
android:id="@ id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/textView1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/textView1" />
<TextView
android:id="@ id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/textView1"
app:layout_constraintTop_toBottomOf="@id/switch1" />
</androidx.constraintlayout.widget.ConstraintLayout>
For switch1
I have to use layout_constraintTop_toTopOf
and layout_constraintBottom_toBottomOf
to center it horizontally with textView1
. Otherwise switch1
would be too big.
textView2
should be visible below switch1
if switch1
is visible and otherwise aligned with the top of textView1
.
How an I achieve this?
Currently textView2
is visible below switch1
if switch1
is visible but otherwise aligned with the bottom of textView1
.
Thanks!
CodePudding user response:
You need to use Barrier
for such conditions. Try following code.
<TextView
android:id="@ id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="Demo"
app:layout_constraintEnd_toStartOf="@id/barrier"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Barrier
android:id="@ id/barrier"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:orientation="vertical"
app:barrierDirection="left"
app:constraint_referenced_ids="textView2, switch1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@ id/textView1"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.SwitchCompat
android:id="@ id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/textView1"
app:layout_constraintStart_toEndOf="@id/barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/textView1" />
<TextView
android:id="@ id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_marginHorizontal="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/barrier"
app:layout_constraintTop_toBottomOf="@id/switch1" />
CodePudding user response:
You can simply make the switch1 visibility to gone in the class instead of making it invisible
switch1.visibility = VIEW.GONE
and the textview2 will jump and take its place after textview1
Hope this helps!!