Неправильный порядок детей FrameLayout на Android 5.0 и выше
Вот мой код компоновки XML:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<Button
android:id="@+id/btn_test"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@android:color/black"
android:minHeight="0dp"
android:minWidth="0dp" />
<TextView
android:id="@+id/tv_test"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:gravity="center"
android:text="12"
android:textColor="@android:color/black"
android:textStyle="bold" />
</FrameLayout>
Как я и ожидал TextView
будет накладываться на Button
, но работает только на Android < 5.0. Я исследую для всех изменений API о FrameLayout
с сайта разработчика, но все еще не получаю точную информацию. Кто-нибудь нашел это? Как наложить TextView
на Button
через XML?
4 ответа
Наконец-то я узнал об изменениях. То есть evelation
, Надеюсь это поможет другим. http://developer.android.com/training/material/shadows-clipping.html
Добавлять stateListAnimator="@null"
на ваш XML кнопки:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<Button
android:id="@+id/btn_test"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@android:color/black"
android:minHeight="0dp"
android:minWidth="0dp"
android:stateListAnimator="@null" />
...
</FrameLayout>
Это сделает Button
уважать его Z-индекс и позиционировать его под TextView
,
Я не смог найти правильный ответ на ваш вопрос, но для текущей разработки могу предложить макет, который вам требуется.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_test"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@android:color/black"
android:minHeight="0dp"
android:minWidth="0dp" />
</LinearLayout>
<TextView
android:id="@+id/tv_test"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:gravity="center"
android:text="12"
android:textColor="@android:color/black"
android:textStyle="bold" />
</FrameLayout>
Это дополнение к ответу @John. Вы можете сделать что-то вроде этого:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<Button
android:id="@+id/btn_test"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@android:color/black"
android:minHeight="0dp"
android:minWidth="0dp" />
<TextView
android:id="@+id/tv_test"
...
android:elevation="20dp"
... />
</FrameLayout>
И тогда в коде:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finfViewById(R.id.tv_test).setOutlineProvider(null);
}