Кнопка всегда отображается сверху в 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>