risposta

10

Modifica

Il AppBarLayout da v24.0.0 utilizza un StateListAnimator che definisce l'elevazione seconda del suo stato. Quindi l'uso di setElevation non ha alcun effetto se si utilizza uno StateListAnimator (che si verifica per impostazione predefinita). Impostare la elevation via XML o di programmazione (API sia per> = 21):

StateListAnimator stateListAnimator = new StateListAnimator(); 
stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); 
appBarLayout.setStateListAnimator(stateListAnimator); 

Vecchio risposta

Questo sembra essere un issue of the design support library. Il problema è legato al modo in cui l'elevazione viene impostata a livello di programmazione, utilizzando setElevation. Impostandolo dall'XML si posiziona un StateListAnimator nella vista e non si chiama setElevation. Tuttavia, setElevation dovrebbe funzionare.

Qui c'è una soluzione:

setDefaultAppBarLayoutStateListAnimator(appBarLayout, 0); 

@SuppressLint("PrivateResource") 
private static void setDefaultAppBarLayoutStateListAnimator(final View view, final float targetElevation) { 
    final StateListAnimator sla = new StateListAnimator(); 

    // Enabled, collapsible and collapsed == elevated 
    sla.addState(new int[]{android.R.attr.enabled, android.support.design.R.attr.state_collapsible, 
      android.support.design.R.attr.state_collapsed}, 
      ObjectAnimator.ofFloat(view, "elevation", targetElevation)); 

    // Enabled and collapsible, but not collapsed != elevated 
    sla.addState(new int[]{android.R.attr.enabled, android.support.design.R.attr.state_collapsible, 
      -android.support.design.R.attr.state_collapsed}, 
      ObjectAnimator.ofFloat(view, "elevation", 0f)); 

    // Enabled but not collapsible == elevated 
    sla.addState(new int[]{android.R.attr.enabled, -android.support.design.R.attr.state_collapsible}, 
      ObjectAnimator.ofFloat(view, "elevation", targetElevation)); 

    // Default, none elevated state 
    sla.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); 

    view.setStateListAnimator(sla); 
} 

Questo è preso da ciò che il costruttore fa, chiamando un metodo nella classe ViewUtilsLollipop in v24.0.0.

+0

Quali 'view' viene utilizzato nel tuo esempio' stateListAnimator.addState (new int [0], ObjectAnimator.ofFloat (vista, "elevazione", 0)); '? –

+0

@VolodymyrKhodonovych quello passato come parametro – bryant1410

+1

Ho un errore in Android 21 come questo> JNI RILEVATO ERRORE IN APPLICAZIONE: impossibile chiamare il numero > android.view.View.setElevation (float) su oggetto nullo –

3

Una soluzione più possibile per questo è di aggiungere android:stateListAnimator="@null" al AppBarLayout come illustrato di seguito.

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:stateListAnimator="@null" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
Problemi correlati