Как заполнить макет между двумя представлениями в RelativeLayout? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть этот простой макет с 2 иконками и SearchView между ними. Я хочу, чтобы SearchView находился между этими двумя значками (так же, как match_constraint в ConstraintLayout). Я хочу использовать RelativeLayout, потому что отрицательные поля не работают в ConstraintLayout (вы должны использовать разделители, которые не эффективны в моем случае).

Это решение не работает. Он вытолкнет второй значок из представления, и в этом случае SearchView будет соответствовать match_parent. Причина отрицательного поля: разрыв между Icon и SearchView в приложении большой, даже без полей. Поэтому я хочу использовать отрицательные поля для значков, чтобы приблизить их к краю SearchView (EditText внутри)

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="16dp"
        android:layout_marginTop="32dp">

        <ImageButton
            android:id="@+id/icon_1"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:adjustViewBounds="true"
            android:background="@android:color/transparent"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/ico_1" />

        <android.support.v7.widget.SearchView
            android:id="@+id/action_search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toEndOf="@id/icon_1"
            android:background="@color/colorTransparent"
            android:backgroundTint="@color/colorTransparent"
            android:focusedByDefault="false"
            app:closeIcon="@null"
            app:iconifiedByDefault="false"
            app:searchHintIcon="@null"
            app:searchIcon="@null">

        </android.support.v7.widget.SearchView>

        <ImageButton
            android:id="@+id/icon_2"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_toEndOf="@id/action_search"
            android:layout_centerVertical="true"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="15dp"
            android:adjustViewBounds="true"
            android:background="@android:color/transparent"
            android:scaleType="fitCenter"
            android:src="@drawable/ico_2" />
    </RelativeLayout>

Изображение:

enter image description here

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Попробуйте это

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginBottom="16dp"
    android:layout_marginTop="32dp">

    <ImageButton
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:adjustViewBounds="true"
        android:layout_gravity="center_vertical"
        android:background="@android:color/transparent"
        android:src="@drawable/ic_menu_send" />


    <android.support.v7.widget.SearchView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        app:closeIcon="@null"
        android:layout_gravity="center"
        app:iconifiedByDefault="false"
        app:searchHintIcon="@null"
        app:searchIcon="@null"/>

    <ImageButton
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:adjustViewBounds="true"
        android:layout_gravity="center_vertical"
        android:background="@android:color/transparent"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_menu_send" />


</LinearLayout>
0 голосов
/ 06 сентября 2018

Это будет работать для вас, просто попробуйте это

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_marginBottom="16dp"
    android:layout_marginTop="32dp"
    android:orientation="horizontal">

    <ImageButton
    android:id="@+id/icon_1"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:layout_gravity="center_horizontal"
    android:adjustViewBounds="true"
    android:background="@android:color/transparent"
    android:src="@drawable/ico_1"
    android:layout_alignParentLeft="true" />

    <android.support.v7.widget.SearchView
    android:id="@+id/action_search"
    app:closeIcon="@null"
    app:iconifiedByDefault="false"
    app:searchHintIcon="@null"
    app:searchIcon="@null"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toEndOf="@id/icon_1"
    android:background="@android:color/transparent"
    android:backgroundTint="@android:color/transparent"
    android:focusedByDefault="false"
    android:layout_toRightOf="@id/icon_1">

    </android.support.v7.widget.SearchView>

    <ImageButton
    android:id="@+id/icon_2"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_alignParentEnd="true"
    android:layout_centerVertical="true"
    android:layout_marginEnd="15dp"
    android:layout_toEndOf="@id/action_search"
    android:adjustViewBounds="true"
    android:background="@android:color/transparent"
    android:scaleType="fitCenter"
    android:src="@drawable/ico_2"
    android:layout_alignParentRight="true"
    android:layout_marginRight="15dp"
    android:layout_toRightOf="@id/action_search" />
    </RelativeLayout>
0 голосов
/ 06 сентября 2018

Идея состоит в том, что вы должны создать представление, которое заполняет все доступное пространство, которое создается с помощью match_parent в layout_width.

затем вы сообщаете представлению, что оно начнется там, где заканчивается первый значок, и закончится там, где заканчивается второй значок, что сделано с layout_toEndOf и layout_toStartOf (вы пропустили этот последний)

наконец, поскольку вы ссылаетесь на имя, которое еще не было объявлено в этой области, вы должны назвать второе имя как "@ + id / icon_2", и в объявлении вашего представления установите имя, не создавая новое id "@ id / icon_2", в конце ваш код будет выглядеть так:

<android.support.v7.widget.SearchView
        android:id="@+id/action_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/icon_1"
        android:layout_toStartOf="@+id/icon_2"
        android:background="@color/colorTransparent"
        android:backgroundTint="@color/colorTransparent"
        android:focusedByDefault="false"
        app:closeIcon="@null"
        app:iconifiedByDefault="false"
        app:searchHintIcon="@null"
        app:searchIcon="@null">
</android.support.v7.widget.SearchView>

<ImageButton
        android:id="@id/icon_2"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_toEndOf="@id/action_search"
        android:layout_centerVertical="true"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="15dp"
        android:adjustViewBounds="true"
        android:background="@android:color/transparent"
        android:scaleType="fitCenter"
        android:src="@drawable/ico_2" />
...