переключить видимость группы цепочек в макете ограничения

В предыдущем макете xml у меня было несколько групп представлений с несколькими элементами внутри. Скрыть каждую группу просмотра также скроет все ее дочерние элементы. Так как я хотел иметь плоскую структуру и попробовал ConstraintLayout. Круто, я знаю, как связать элемент с разворотом, чтобы правильно выровнять. Поскольку плоская структура не имеет обернутого LinearLayout, теперь у меня есть 3 представления, которые нужно скрыть. Я хотел бы знать, есть ли альтернатива для достижения этого.

Без ограничения макета

<RelativeLayout....
..........
..........
<LinearLayout
        android:visibility="gone"
        tools:visibility="visible"
        android:id="@+id/filter_area"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/lblTerminal"
            android:background="@color/lightGray"
            style="@style/PurpleSubtitle"
            android:drawableRight="@drawable/i_down_yellow"
            android:drawableEnd="@drawable/i_down_yellow"
            android:padding="10dp"
            android:text="@string/lblTerminal"
            android:layout_weight="5"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />

        <View
            android:background="@android:color/black"
            android:layout_width="1dp"
            android:layout_height="match_parent"/>

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/lblCategory"
            android:background="@color/lightGray"
            android:padding="10dp"
            android:drawableRight="@drawable/i_down_yellow"
            android:drawableEnd="@drawable/i_down_yellow"
            style="@style/PurpleSubtitle"
            android:text="@string/lblCategory"
            android:layout_weight="5"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />


    </LinearLayout>
  .......
  .......
  </RelativeLayout>

С макетом ограничения

    <android.support.constraint.ConstraintLayout
    .....
    .....
    .....
       #happy that i no longer need LinearLayout for align properly
       <android.support.v7.widget.AppCompatTextView
            android:id="@+id/lblTerminal"
            android:background="@color/lightGray"
            style="@style/PurpleSubtitle"
            android:drawableRight="@drawable/i_down_yellow"
            android:drawableEnd="@drawable/i_down_yellow"
            android:padding="10dp"
            android:text="@string/lblTerminal"
            android:layout_weight="5"
            android:layout_width="0dp"
            android:layout_height="50dp"
            app:layout_constraintTop_toBottomOf="@+id/txt_search"
            app:layout_constraintRight_toLeftOf="@+id/view3"
            app:layout_constraintLeft_toLeftOf="@+id/guideline2"
            app:layout_constraintHorizontal_chainStyle="spread"/>

        <View
            android:background="@android:color/black"
            android:layout_width="1dp"
            android:layout_height="50dp"
            android:id="@+id/view3"
            app:layout_constraintTop_toBottomOf="@+id/txt_search"
            app:layout_constraintRight_toLeftOf="@+id/lblCategory"
            app:layout_constraintLeft_toRightOf="@+id/lblTerminal" />

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/lblCategory"
            android:background="@color/lightGray"
            android:padding="10dp"
            android:drawableRight="@drawable/i_down_yellow"
            android:drawableEnd="@drawable/i_down_yellow"
            style="@style/PurpleSubtitle"
            android:text="@string/lblCategory"
            android:layout_width="0dp"
            android:layout_height="50dp"
            app:layout_constraintTop_toTopOf="@+id/view3"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toRightOf="@+id/view3" />



  ......
  ......
  ......

  </android.support.constraint.ConstraintLayout>

person Tixeon    schedule 09.06.2017    source источник
comment
Вы хотите переключить видимость всего макета ограничения или его дочернего элемента?   -  person Kishan Vaghela    schedule 09.06.2017
comment
да, я хочу переключить видимость элементов группы цепочки   -  person Tixeon    schedule 09.06.2017
comment
Так в чем проблема, когда вы меняете видимость.?   -  person Kishan Vaghela    schedule 09.06.2017
comment
с линейной группой просмотра макета я могу просто скрыть группу просмотра, и все ее дочерние элементы будут скрыты. с макетом ограничений у меня больше нет этой силы. значит, я должен скрыть каждый вид   -  person Tixeon    schedule 09.06.2017
comment
Макет Constraints также является ViewGroup, поэтому вы можете скрыть весь макет вместо того, чтобы скрывать каждый дочерний макет.   -  person Kishan Vaghela    schedule 09.06.2017
comment
у меня также есть другие представления в том же файле макета. я показываю только его части. я должен был загрузить все . я скоро обновлю свой вопрос   -  person Tixeon    schedule 09.06.2017


Ответы (3)


Да, теперь в ConstraintLayout мы также можем обрабатывать видимость определенных групп представлений с помощью Group

<сильный>

Это новая функция, представленная в ConstraintLayout, которая в настоящее время находится в бета-версии.

Как добавить бета-версию ConstraintLayout в свой проект? Выполните следующие действия:

Добавьте поддержку maven в файл проекта gradle, как показано ниже

allprojects {
    repositories {
        maven { url 'https://maven.google.com' }
        jcenter()
    }
}

Затем в зависимостях приложения gradle добавьте зависимость библиотеки ConstraintLayout

compile 'com.android.support.constraint:constraint-layout:1.1.0-beta3'

Теперь вам нужно добавить Group в свой ConstraintLayout следующим образом

<android.support.constraint.Group
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="button7,button3,button2"
        android:id="@+id/group" />  

Где в Group идентификатор ссылки...

app:constraint_referenced_ids="button7,button3,button2"

... содержит идентификатор представления, разделенный запятыми, который вы хотите обрабатывать во время выполнения, поэтому в действии вы просто привязываете Group, как показано ниже, и обрабатываете видимость

import android.support.constraint.Group; //import statement in activity

Group group=(Group)findViewById(R.id.group); //bind view from xml
group.setVisibility(View.VISIBLE); //this will visible all views
group.setVisibility(View.GONE); //this will set Gone to all views
group.setVisibility(View.INVISIBLE); //this will set INVISIBLE to all view

EDIT: ConstraintLayout стабильная версия 1.1.0 была выпущена 12 апреля 2018 г. https://androidstudio.googleblog.com/2018/04/constraintlayout-110.html

implementation 'com.android.support.constraint:constraint-layout:1.1.0'

Изменить для Android X: если кто-то использует пакет Android X, вы можете найти информацию о пакете здесь.

https://developer.android.com/jetpack/androidx/migrate

person Pavan    schedule 10.06.2017
comment
group удален из constraintLayout? Я не могу найти его нигде. - person mcy; 21.11.2017
comment
Это бета-версия, следуйте инструкциям по добавлению бета-версии, проверьте, что это новая бета-версия 3 androidstudio.googleblog.com/2017/10/ - person Pavan; 21.11.2017
comment
Я хотел бы добавить, что в настоящее время изменение видимости группы на View.INVISIBLE не работает. Похоже на ошибку в реализации. Дополнительная информация здесь stackoverflow.com/questions/47865436 / - person lukjar; 06.06.2018

Если вы используете бета-версию limitedlayout, следуйте ответу @pavan.

Если вы используете AndroidX, выполните следующие шаги, чтобы интегрировать limitedlayout и Group:

1) Добавьте зависимость макета ограничения AndroidX в свой проект:

implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

2) Используйте группу ConstraintLayout, как показано ниже, в своем проекте:

<androidx.constraintlayout.widget.Group
                    android:id="@+id/groupDetails"
                    android:layout_width="wrap_content"
                    android:visibility="gone" // Default visibility for group views
                    app:constraint_referenced_ids="textViewUserName, ..." // id's which you want to include in group
                    android:layout_height="wrap_content"/>

3) Вот часть кода для переключения видимости:

private lateinit var groupDetails:Group

...
groupDetails = findViewById(R.id.groupDetails)
groupDetails.visibility = View.GONE // Change visibility

Надеюсь, это поможет при использовании AndroidX.

person pRaNaY    schedule 11.12.2018

Вы также можете использовать тот же линейный макет в качестве дочернего элемента макета с ограничениями, ИЛИ вы также можете сделать все эти 3 виджета дочерними элементами другого макета с ограничениями и сделать этот макет дочерним по отношению к основному макету с ограничениями.

Затем вы можете сохранить видимость и другие вещи такими же, как и раньше.

person Hardik Maru    schedule 09.06.2017
comment
хм, я хочу иметь плоскую структуру, похоже, мне нужно использовать группу просмотра, как вы упомянули :-( - person Tixeon; 09.06.2017
comment
Да, вы можете добиться этого, используя как Constraint Layout, так и Linear Layout. - person Hardik Maru; 09.06.2017
comment
да @lelloman, если я оберну LinearLayout, нет смысла использовать ConstraintLayout - person Tixeon; 09.06.2017