Android 5.0 – ProgressBar ne peut pas être affiché sur un bouton

Je pense que le titre est assez explicite sur mon problème … Alors voici 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, ProgressBar est correctement affiché sur le bouton et centré sur le bouton. Mais sur Android 5.0, ProgressBar s'affiche derrière le bouton.

  • Pourquoi Android est construit sur une machine virtuelle (Dalvik)
  • Enregistrement d'un mot de passe
  • Affichage de l'affichage de l'affichage de l'affichage lorsque ListView est vide
  • Comment déséquilibrer le périphérique bluetooth en utilisant android 2.1 sdk
  • State_activated on pre Honeycomb Devices
  • Android GCM envoyé avec succès mais pas reçu sur certains périphériques
  • Ainsi, vous pouvez voir qu'il est correctement positionné lorsque vous activez l'option "Afficher les limites de disposition" dans les paramètres des Options du développeur, mais vous ne pouvez rien voir sur l'écran sans cette option.

    Quelqu'un pourrait-il savoir comment réparer ce problème? Je suppose que c'est une question d' élévation récemment introduite, mais je ne sais vraiment pas comment s'en occuper. Pour mémoire, j'utilise le style Theme.AppCompat récemment lancé depuis le support.v7.

    MODIFIER:

    J'ai également essayé d'appliquer setElevation(0) et setTranslationY(0) au bouton par programme, mais il n'a rien changé. Je me demande si cela doit faire face à l'élévation.

    Merci d'avance les gars

    Mathieu

  • Comment puis-je importer un certificat CA dans Android 4.4.2 dans l'émulateur?
  • Modification de la couleur du texte de l'élément de menu dans le tiroir de navigation
  • GridView ne montre que deux colonnes
  • Disposition personnalisée d'Android ProgressBar UI
  • Le service Android se bloque après que l'application a été effacée de la liste des applications récentes
  • Détection du commutateur GPS on / off dans les téléphones Android
  • 5 Solutions collect form web for “Android 5.0 – ProgressBar ne peut pas être affiché sur un bouton”

    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"/> 

    La même question est posée ici, avec une meilleure explication de la question:

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

    Pour citer @CommonsWare:

    Le problème apparaît la propriété d' elevation Android 5.0. Apparemment, l'ordre RelativeLayout aux axes Z de RelativeLayout est lié en elevation . Si les deux widgets ont la même elevation , RelativeLayout déterminera l'ordre des axes Z – vous pouvez voir que si vous deviez changer votre disposition pour être deux widgets Button , par exemple. Toutefois, si un widget ( Button ) a une elevation , et qu'un autre widget ( ImageView ) ne l'est pas, l' elevation prendra la priorité.

    Vous pouvez supprimer l' elevation du Button via android:stateListAnimator="@null" ou en définissant votre propre animateur personnalisé . Ou, vous pouvez ajouter une certaine elevation à votre ImageView pour l'obtenir plus haut sur l'axe Z que le Button .

    Probablement, le moyen le plus simple est d'utiliser FrameLayout car il a été créé pour créer des mises en page dont l'affichage des enfants est commandé par 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> 

    Je ne suis pas sûr de ce que votre mise en page ressemble, alors peut-être que vous devrez jouer avec android:layout_gravity .

    Il est préférable de définir Android: translationZ plus de 2dp. Votre vue / widget disparaît 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> 

    Button ont ces deux valeurs et définies dans le cadre .

    Le 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> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.