Android ConstraintLayout - Как переместить вид на занятое пространство?

Да, ваш рабочий орган пуст. Это не фатальная ошибка, просто замените ></activity> на />

1
задан plaskoff 14 July 2018 в 00:02
поделиться

1 ответ

Я могу придумать два способа сделать это. Тот, который использует только XML, но менее гибкий, и второй, который требует некоторых изменений в коде и дает больший контроль над Views. Обратите внимание, что оба они будут работать только тогда, когда видимость цветового сегмента установлена ​​на GONE, поскольку представления, которые INVISIBLE все еще занимают место.

  1. Мы устанавливаем процент ширины для обоих представлений 50%. Когда сегмент цвета GONE, сегмент размера будет скользить влево из-за горизонтального смещения. Это решение может не сработать, если вы установите поля для этих представлений, поскольку они имеют фиксированный размер 50% доступной ширины макета.
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/color"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Color"
            app:layout_constraintWidth_percent="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0"/>
    
        <TextView
            android:id="@+id/size"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Size"
            app:layout_constraintWidth_percent="0.5"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/color"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0"/>
    
    </android.support.constraint.ConstraintLayout>
    
  2. Мы помещаем оба представления в взвешенную цепочку, а также добавляем хелпер Space к нему, чтобы действовать как наполнитель оставшегося пространства, когда представление «Цвет» GONE. Мнения, которые видны, имеют вес 0.5, каждый из которых занимает половину доступного пространства. Хелпер Space имеет вес 0 и поэтому не виден. XML:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/layout">
    
        <TextView
            android:id="@+id/color"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Color"
            app:layout_constraintEnd_toStartOf="@id/size"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintHorizontal_weight="0.5"/>
    
        <TextView
            android:id="@+id/size"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Size"
            app:layout_constraintEnd_toStartOf="@id/space"
            app:layout_constraintStart_toEndOf="@id/color"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_weight="0.5"/>
    
        <Space
            android:id="@+id/space"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/size"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintHorizontal_weight="0"/>
    
    </android.support.constraint.ConstraintLayout>
    
    Теперь, когда вам нужно скрыть свой сегмент цвета, вы сделаете что-то вроде этого:
    ConstraintSet cs = new ConstraintSet();
    ConstraintLayout layout = findViewById(R.id.layout);
    Space space = findViewById(R.id.space);
    TextView color = findViewById(R.id.color);
    cs.clone(layout);
    cs.setHorizontalWeight(space.getId(), 0.5f);
    cs.applyTo(layout);
    color.setVisibility(View.GONE);
    
    Это приведет к исчезновению сегмента Color, но сегмент размера будет скользить влево, потому что ограничения сохраняются, даже тогда Видимость вида установлена ​​на GONE. Space имеет свой вес, установленный в 0.5, и займет правую половину пробела.
0
ответ дан plaskoff 17 August 2018 в 12:10
поделиться
  • 1
    # 1 также можно выполнить с помощью линейных весов. спасибо за вашу большую помощь. – j2emanue 15 July 2018 в 17:05
Другие вопросы по тегам:

Похожие вопросы: