Android 5.0 - ProgressBar не может отображаться над кнопкой

Я думаю, что заголовок довольно ясен о моей проблеме... Итак, вот мой макет:

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

                <Button
                    android:id="@+id/button_action"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Login" />

                <ProgressBar
                    android:id="@+id/progress_bar"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_centerInParent="true"/>

            </RelativeLayout>

В SDK & 21, без проблем, ProgressBar правильно отображается над кнопкой и центрируется на кнопке. Но на Android 5.0 на ProgressBar отображается кнопка позади.

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

Кто-нибудь знает, как это исправить? Я предполагаю, что это вопрос повышения, который недавно был представлен, но я действительно не знаю, как позаботиться об этом. Для записи я использую недавно выпущенный стиль Theme.AppCompat из файла support.v7.

EDIT:

Я также попытался применить программные кнопки setElevation(0) и setTranslationY(0) к программе, но ничего не изменил. Поэтому я задаюсь вопросом, нужно ли иметь дело с высотой.

Спасибо заранее, ребята

Матье

Ответ 1

Вы можете использовать атрибут android: translationZ в ProgressBar:

        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:translationZ="2dp"
            android:layout_centerInParent="true"/>

Ответ 2

Здесь задают тот же вопрос, который лучше объясняет проблему:

fooobar.com/questions/459131/...

Для цитирования @CommonsWare:

Появилась проблема с Android 5.0 elevation. По всей видимости, порядок RelativeLayout Z-оси привязан к elevation. Если оба виджеты имеют тот же самый elevation, RelativeLayout определит порядок Z-оси - вы можете видеть, что если бы вы переключали макет например, для виджетов Button. Однако, если один виджет (Button) имеет elevation, а другой виджет (ImageView) не, elevation будет иметь приоритет.

Вы можете удалить Button elevation через android:stateListAnimator="@null" или определяющий ваш собственный аниматор. Или вы можете добавить несколько elevation в свой ImageView, чтобы чтобы он был выше по оси Z, чем Button.

Ответ 3

Такая же проблема, мой простой "взлом" был слишком обернут Button в другой FrameLayout. Таким образом, меня не волнует версия api и другая проблема с возвышением;)

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

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
                <Button
                    android:id="@+id/button_action"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Login" />
        </FrameLayout>

        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="50dp"
            android:layout_height="50dp" />
</FrameLayout>

Ответ 4

Лучше установить android: translationZ более 2dp. Когда вы нажмете кнопку, ваш вид/виджет исчезнет. Я объяснил причину здесь.

<!-- Elevation when button is pressed -->
<dimen name="button_elevation_material">1dp</dimen>
<!-- Z translation to apply when button is pressed -->
<dimen name="button_pressed_z_material">2dp</dimen>
Кнопка

имеет эти два значения и определена в framework.

Ответ 5

Вероятно, самый простой способ - использовать FrameLayout, поскольку он был создан для создания макетов, чьи дочерние представления упорядочены по z-index:

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

            <Button
                android:id="@+id/button_action"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Login" />

            <ProgressBar
                android:id="@+id/progress_bar"
                android:layout_width="50dp"
                android:layout_height="50dp" />
    </FrameLayout>

Я не уверен, как выглядит ваш макет, поэтому, возможно, вам нужно будет играть с android:layout_gravity.