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>

на Android SDKs за кнопки.

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

кто-нибудь знает как это исправить? Я думаю, это вопрос высота недавно представил, но я действительно не знаю, как позаботиться об этом. Для записи, я использую недавно выпущенную тему.Стиль AppCompat из поддержки.В7.

EDIT:

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

заранее спасибо, ребята!--4-->

Матье

5 ответов


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

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

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

https://stackoverflow.com/a/27216368/235910

процитировать @CommonsWare:

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

вы можете удалить Button elevation через android:stateListAnimator="@null" или определить собственные аниматор!--20-->. Или, вы можете добавить elevation на ImageView в получите его выше по оси Z, чем 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>

лучше установить 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>

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


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

    <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.