13

Credo che il titolo è abbastanza esplicito circa il mio problema ... Così qui è il mio layout:Android 5.0 - ProgressBar non può essere visualizzata su un pulsante

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

Su SDK Android < 21, nessun problema, il ProgressBar viene visualizzato correttamente sul pulsante e centrato nel pulsante. Ma su Android 5.0, il ProgressBar viene visualizzato dietro il pulsante.

Quindi è possibile visualizzarlo correttamente quando si attiva l'opzione "Mostra limiti di layout" nelle impostazioni di Opzioni sviluppatore, ma non è possibile visualizzare nulla sullo schermo senza quell'opzione.

Qualcuno saprebbe come risolvere il problema? Immagino sia una questione di di elevazione recentemente introdotta, ma non so davvero come prendertene cura. Per la cronaca, sto utilizzando lo stile Theme.AppCompat rilasciato di recente da support.v7.

EDIT:

Ho anche cercato di applicare setElevation(0) e setTranslationY(0) al pulsante di programmazione, ma non ha cambiato nulla. Quindi mi chiedo se ha a che fare con l'elevazione.

Grazie in anticipo ragazzi

Mathieu

+0

v'è alcuna ragione per cui non si usa 'FrameLayout'? – Smileek

+0

No, non proprio. Solo una questione di abitudine credo. Potrebbe cambiare qualcosa? – MathieuMaree

+0

@ViewMa, sì. Per favore, controlla la mia risposta. – Smileek

risposta

37

È possibile utilizzare Android: attributo translationZ in ProgressBar:

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

Grazie per la tua risposta wpiwonski, ma no, non ho cambiato nulla – MathieuMaree

+2

È strano. Ho controllato il codice sull'emulatore e ProgressBar ora si trova sul pulsante. 1 dp non è stato sufficiente, ma 2 dp hanno spostato ProgressBar in primo piano. – wpiwonski

+1

Errore mio, ho provato a impostare la conversione del pulsanteZ su 0 invece di aumentare la barra di avanzamento. Funziona davvero, grazie! – MathieuMaree

-1

Probabilmente il modo più semplice è quello di utilizzare il FrameLayout da quando è stato creato per rendere i layout le cui viste figlio sono ordinate per 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> 

Non sono sicuro di come sia il layout, quindi forse dovrai giocare con android:layout_gravity.

+7

Non sembra funzionare, il ProgressBar è ancora dietro il pulsante – MathieuMaree

+0

Sei quasi vero! è necessario avvolgere la vista del pulsante in un altro frameLayout. Vedi la mia risposta. – Tobliug

3

Stessa domanda viene chiesto qui, con una migliore spiegazione del problema:

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

Per citare @CommonsWare:

il problema sembra immobile Android 5.0 di elevation. Apparentemente, l'ordinamento sull'asse Z è RelativeLayout collegato allo elevation. Se entrambi i widget hanno lo stesso elevation, lo RelativeLayout determinerà l'ordine dell'asse Z - puoi vedere che se dovessi cambiare il layout in entrambi i widget Button, ad esempio. Tuttavia, se un widget (Button) ha un elevation e un altro widget (ImageView) non corrisponde a , lo elevation avrà la precedenza.

È possibile rimuovere il Buttonelevation tramite android:stateListAnimator="@null" o defining your own custom animator.In alternativa, è possibile aggiungere al numero a per ottenere un valore più alto sull'asse Z rispetto a Button.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

abbastanza giusto, modificato la risposta;) – LambergaR

0

È meglio impostare android: translationZ più di 2dp. La tua vista/widget sparirà quando premi il pulsante. Ho spiegato il motivo here.

<!-- 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 hanno questi due valori e definito nel framework.

2

Lo stesso problema qui, il mio semplice "trucco" era troppo avvolgente il pulsante in un altro FrameLayout. In questo modo non mi interessa sulla versione api e altro problema di elevazione;)

<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> 
Problemi correlati