从android支持库v23.4.0升级到v24.0.0时,将高程设置为0,将高程设置为appbarlayout停止工作:
appBayLayout.setElevation(0);
在设置XML的高程时确实可以工作。
edit
v24.0.0的AppBarLayout
使用StateListAnimator
根据其状态定义高程。因此,如果使用StateListAnimator
,使用setElevation
将无效(默认情况下会发生)。通过XML或编程设置elevation
(均用于API> = 21):
StateListAnimator stateListAnimator = new StateListAnimator();
stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0));
appBarLayout.setStateListAnimator(stateListAnimator);
旧答案
这似乎是设计支持库的问题。该问题与使用setElevation
通过编程设置的高程设置有关。从XML设置它是在视图中放置StateListAnimator
,而不是调用setElevation
。但是,setElevation
应该起作用。
这里有一个解决方法:
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);
}
这是从构造函数中获取的,在v24.0.0中的类ViewUtilsLollipop
中调用一种方法。
另一种可能的解决方案是将 android:stateListAnimator="@null"
添加到您的AppBarLayout
中。
<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">
在我的情况下,我需要在运行时更改AppBarLayout
的高度,并且setElevation(..)
做到了。
但是,在屏幕旋转并从onCreateOptionMenu
调用setElevation(..)
之后,setStateListAnimator(null)
做到了。
因此,我得到了这种逻辑:
public final float appBarElevation = 10.5f;
public void disableAppBarElevation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
appBarLayout.setElevation(0);
appBarLayout.setStateListAnimator(null);
}
}
public void enableAppBarElevation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
appBarLayout.setElevation(appBarElevation);
}
}