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.
Quali 'view' viene utilizzato nel tuo esempio' stateListAnimator.addState (new int [0], ObjectAnimator.ofFloat (vista, "elevazione", 0)); '? –
@VolodymyrKhodonovych quello passato come parametro – bryant1410
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 –