Неправильный порядок детей 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);
}
Другие вопросы по тегам