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
собственность. По-видимому, theRelativeLayout
упорядочение оси Z привязано кelevation
. Если оба виджеты имеют то же самоеelevation
, theRelativeLayout
будет определять порядок оси 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
.