web-dev-qa-db-ja.com

制約レイアウトのチェーングループの表示を切り替える

以前の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>
19
Tixeon

はい、だから今ConstraintLayoutでもGroupを使用してビューの特定のグループの可視性を処理できます

これは、現在ベータ版であるConstraintLayoutで導入された新機能です。

ベータ版のConstraintLayoutをプロジェクトに追加する方法は次のとおりです。

以下のようにプロジェクトgradleファイルにMavenサポートを追加します

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

その後、アプリのgardle依存関係にConstarintLayoutライブラリの依存関係を追加します

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

次のようにConstraintLayouにグループを追加する必要があります

<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" />  

グループ参照IDのどこか

app:constraint_referenced_ids="button7,button3,button2"

実行時に処理するコンマ区切りのビューIDが含まれているため、アクティビティでは、次のようにグループをバインドして可視性を処理します

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

2018年4月12日にリリースされたConrtsaintLayout 1.1.0安定版の編集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

36
Pavan

Constraintlayoutのベータ版を使用している場合は、@ pavanの answer に従ってください。

AndroidXを使用している場合は、以下の手順に従ってconstraintlayoutとGroupを統合してください。

1)プロジェクトにAndroidX制約レイアウトの依存関係を追加します。

implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

2)プロジェクトで次のようにConstraintLayout Groupを使用します。

<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の使用中に役立つことを願っています。

1
pRaNaY