Неверный порядок рендеринга для кнопки при применении материальной темы

Виджет кнопки рисует поверх любого другого виджета независимо от структуры макета. Он повторяется как в RelativeLayout, так и в FrameLayout, когда применяется тема Dark Dark/Light. Посмотрите скриншоты ниже, чтобы лучше показать это странное поведение.

Проверено на Nexus 4 и Nexus 5. Однако я сомневаюсь, что это связано с устройствами.

How it looks in Android Studio

How it looks on my Nexus 4

Ответ 1

Android 5.0 Lollipop вместе с Material Design представила новое свойство, чтобы указать высоту (Z-индекс) виджетов. Он описан здесь.

Чтобы нарисовать вид над кнопкой, вы можете добавить android:elevation="1dp" в представление

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Don't look so deep"
    />
<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#C00"
    android:elevation="1dp"
    />

Ниже приведена часть более раннего ответа на непонятый вопрос, который хранится для дальнейшего использования

С RelativeLayout вы должны указать положение элементов относительно других элементов.

Итак, скажите, что вы хотите иметь View под кнопкой, вам нужно будет добавить id к элементам и указать, что представление находится под кнопкой:

<Button
    android:id="+id/myactivity_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Don't look so deep"
    />
<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#C00"
    android:layout_below="@id/myactivity_button"
    />

Ознакомьтесь с Руководством для разработчиков Android для RelativeLayout и доступных LayoutParameters для RelativeLayouts


FrameLayout обычно не подходит для организации нескольких компонентов. FrameLayout предназначен для блокировки области на экране, чтобы отобразить один элемент. Положение дочерних элементов FrameLayout можно контролировать с помощью атрибута android:layout_gravity.

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:text="Don't look so deep"
    />
<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#C00"
    android:layout_gravity="bottom"
    />

Просмотрите Android-документы для FrameLayout и доступные параметры для layout_gravity

Ответ 2

Начиная с Lollipop (API 21), Android применяет Elevation/Z animation к кнопкам по умолчанию. Чтобы этого избежать, добавьте следующее в XML файл Button:

<Button
    ...
    android:stateListAnimator="@null"
/>

Это заставит кнопку уважать свой Z-индекс.

Источник