Je pense que le titre est assez explicite sur mon problème ... Voici donc ma mise en page:
<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>
Sur Android SDK <21, pas de problème, la barre de progression est correctement affichée sur le bouton et centrée sur le bouton. Mais sur Android 5.0, la barre de progression est affichée derrière le bouton.
Vous pouvez donc voir qu'il est correctement positionné lorsque vous activez l'option "Afficher les limites de la disposition" dans les paramètres des options du développeur, mais vous ne pouvez rien voir à l'écran sans cette option.
Quelqu'un sait-il comment résoudre ce problème? Je suppose que c'est une question de élévation récemment introduit, mais je ne sais vraiment pas comment m'en occuper. Pour mémoire, j'utilise le style Theme.AppCompat récemment publié dans le support.v7.
MODIFIER:
J'ai également essayé d'appliquer setElevation(0)
et setTranslationY(0)
au bouton par programme, mais cela n'a rien changé. Je me demande donc si cela doit traiter de l'élévation.
Merci d'avance les gars
Mathieu
Vous pouvez utiliser l'attribut Android: translationZ dans ProgressBar:
<ProgressBar
Android:id="@+id/progress_bar"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:translationZ="2dp"
Android:layout_centerInParent="true"/>
Même problème ici, mon simple "hack" était trop envelopper le bouton dans un autre FrameLayout. De cette façon, je ne me soucie pas de la version api et d'autres problèmes d'élévation;)
<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>
Même question posée ici, avec une meilleure explication du problème:
https://stackoverflow.com/a/27216368/23591
Pour citer @CommonsWare:
Le problème apparaît Android 5.0 propriété
elevation
. Apparemment, l'ordreRelativeLayout
de l'axe Z est lié àelevation
. Si les deux widgets ont le mêmeelevation
, leRelativeLayout
déterminera l'ordre de l'axe Z - vous pouvez voir que si vous changez votre disposition pour être les deux widgetsButton
, par exemple. Cependant, si un widget (Button
) a unelevation
, et un autre widget (ImageView
) n'en a pas, leelevation
aura la priorité.Vous pouvez supprimer le
Button
elevation
viaAndroid:stateListAnimator="@null"
ou par définir votre propre animateur personnalisé . Ou, vous pouvez ajouter unelevation
à votreImageView
pour qu'il soit plus haut sur l'axe Z que leButton
.
Si vous ajoutez 'androidx.core: core' à votre build.gradle, vous pouvez utiliser ce code pour l'API <21:
ViewCompat.setTranslationZ(viewToElevate, 5);
Il est préférable de configurer Android: translationZ plus de 2dp. Votre vue/widget disparaîtra lorsque vous appuyez sur le bouton. J'ai expliqué la raison ici .
<!-- 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>
Le bouton a ces deux valeurs et défini dans le framework .