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
.