android, как выровнять по вертикали по центру дочерние элементы RelativeLayout - PullRequest
0 голосов
/ 01 марта 2020

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

что-то похожее на левую сторону имеет вертикально AAA, bbb, CCC et c. Они должны вертикально распределять доступное пространство. Поэтому, когда bbb скрыт, у оставшихся AAA CCC будет больше места сверху и снизу.

-------------------  ------------------------
|  AAA            |  |                      |
|                 |  |                      |
|  bbb            |  |      Right side      |
|                 |  |                      |
|  CCC            |  |                      |
-------------------  ------------------------

bbb is visibility = "gone"

-------------------  ------------------------
|                 |  |                      |
|   AAA           |  |                      |
|                 |  |      Right side      |
|   CCC           |  |                      |
|                 |  |                      |
-------------------  ------------------------

изменится на вертикальный LinearLayout для переноса на левую сторону и добавления проставки выше AAA и ниже CCC будет работать, если левая сторона короче, чем правая, но не работает, если левая сторона выше, чем правая.

, когда левая сторона содержит больше содержимого, а высота выше правой, она должна выглядеть следующим образом:

-------------------  ========================
|  AAA            |  |----------------------|
|                 |  |                      |
|  ddd            |  |                      |
|  bbb            |  |      Right side      |
|  eee               |                      |
|                 |  |                      |
|  CCC            |  |----------------------|
-------------------  ========================

Имеет макет, как показано ниже, но он не настраивается, когда некоторые дочерние виды в левой части скрыты, например:

enter image description here

<RelativeLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >


        <!-- "@id/asset_container" is at right side, has a lot children views, not showing here -->
        <FrameLayout
            android:id="@id/asset_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="6dp"

            tools:visibility="visible"

            tools:layout_width="360dp"
            tools:layout_height="120dp"
            tools:background="#ff0000"
        >
        </FrameLayout>

        <!-- left side -->
        <TextView
            android:id="@id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="10dp"
            android:layout_marginBottom="5dp"
            android:layout_toStartOf="@id/asset_container"
            android:ellipsize="end"
            android:maxLines="2"
            tools:text="ad title a little bit long, for testing what the title will look like wrap in second line"
            />

        <!-- "@id/wrapper" has a lot children views, not showing here -->
        <RelativeLayout
            android:id="@id/wrapper"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_alignParentStart="true"
            android:layout_marginEnd="8dp"
            android:layout_toStartOf="@id/asset_container"
            android:visibility="gone"
            android:layout_below="@id/title"
            android:layout_above="@+id/text"

            tools:visibility="gone"

            android:background="#ffff00"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="text text"
                />
            <!-- -->
            <!-- -->
        </RelativeLayout>

        <TextView
            android:id="@id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/asset_container"
            android:layout_marginBottom="10dp"
            android:singleLine="true"
            android:text="test"
            />

        <ImageView
            android:id="@id/icon"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_alignTop="@id/text"
            android:layout_alignBottom="@id/text"
            android:layout_toEndOf="@id/text"
            android:src="@drawable/icon"

            android:layout_centerVertical="true"
            android:layout_gravity="center"
            />

        <TextView
            android:id="@id/name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignTop="@id/text"
            android:layout_alignBottom="@id/text"
            android:layout_toEndOf="@id/icon"
            android:layout_toStartOf="@id/option"
            android:layout_gravity="center_horizontal"
            android:layout_centerHorizontal="true"
            android:gravity="center_vertical"
            tools:text="very long long long name"
            android:singleLine="true"
            android:ellipsize="end"
            />

        <ImageView
            android:id="@+id/optin"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_marginEnd="3dp"
            android:background="?attr/selectableItemBackground"
            android:src="@drawable/ic_more_vert_black_24dp"
            android:layout_centerVertical="true"
            android:layout_gravity="center"
            tools:visibility="visible"
            android:layout_toStartOf="@id/asset_container"
            android:layout_alignTop="@id/text"
            android:layout_alignBottom="@id/text"
            />
    </RelativeLayout>

1 Ответ

0 голосов
/ 02 марта 2020

Сделано это работает, но надеюсь, что есть лучший способ.

<RelativeLayout>
   <!-- left side -->
   <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:layout_toStartOf="@id/right_side_container"
            android:orientation="vertical">

            <Space
                android:layout_width="1dp"
                android:layout_height="0dp"
                android:layout_weight="1"
                />

            <!-- item AAA --->
            <!-- item ddd --->
            <!-- item bbb --->
            <!-- item eee --->
            <!-- item ccc --->


            <Space
                android:layout_width="1dp"
                android:layout_height="0dp"
                android:layout_weight="1"
                />
   <LinearLayout >

   <!-- right side -->
   <FrameLayout
            android:id="@id/right_side_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            tools:visibility="visible"
            >
        <!-- children items -->
   </FrameLayout>

</RelativeLayout>
...