Кнопка всегда отображается сверху в FrameLayout

У меня есть FrameLayout:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeColor"
        android:text="new button"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="some text"/>

</FrameLayout>

Проблема заключается в том, что кнопка отображается сверху, в то время как обзор класса FrameLayout говорит нам об этом: "Детские представления рисуются в стеке, причем последний добавленный ребенок сверху".

Ответы

Ответ 1

Этот ответ

Кнопки в Lollipop и выше имеют возвышение по умолчанию, которое заставляет их всегда рисовать сверху. Вы можете изменить это, переопределив по умолчанию StateListAnimator.

Попробуйте поместить это в свою кнопку XML:

android:stateListAnimator="@null"

Теперь FrameLayout должен охватывать Кнопка.

Ответ 2

В Android 5.0 (API 21) и выше вы должны добавить в представление андроид: высота.

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeColor"
        android:text="new button"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="some text"
        android:elevation="3dp"/>

Ответ 3

Как указано в официальной андроидной документации:

FrameLayout предназначен для блокировки области на экране для отображения один элемент.. В общем случае FrameLayout следует использовать для хранения одного child view, потому что может быть сложно организовать детские представления в способ, который масштабируется до разных размеров экрана без детей перекрывая друг друга. Однако вы можете добавить нескольких детей к FrameLayout и контролировать их положение в FrameLayout присваивая тяжести каждому ребенку, используя андроид: layout_gravity атрибут.

Лучше, если вы разместите Button и Textview в RelativeLayout внутри FrameLayout, например:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="some text"/>
        <Button
            android:id="@+id/button1"
            android:layout_below="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="changeColor"
            android:text="new button"/>
        <RelativeLayout>
    </FrameLayout>

Ответ 4

FrameLayout следует использовать для хранения single child view, так как может быть сложно организовать дочерние представления таким образом, чтобы они масштабировались до разные размеры экрана без детей , перекрывающих друг друга.

Вы должны использовать LinearLayout или RelativeLayout в FrameLayout. Таким образом

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeColor"
        android:text="new button"/>

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

</FrameLayout>

Ответ 5

Вставьте Button внутри FrameLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="new button" />
    </FrameLayout>

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