如何在Android支持库v24.0.0中以编程方式设置AppBarLayout的高程?
从Android支持库v23.4.0升级到v24.0.0时,以编程方式将AppBarLayout的提升设置为0将停止工作:如何在Android支持库v24.0.0中以编程方式设置AppBarLayout的高程?,android,android-support-library,android-support-design,Android,Android Support Library,Android Support Design,从Android支持库v23.4.0升级到v24.0.0时,以编程方式将AppBarLayout的提升设置为0将停止工作: appBayLayout.setElevation(0); 在XML中设置高程时,它确实起作用。Edit v24.0.0中的AppBarLayout使用一个StateListAnimator,它根据其状态定义高程。因此,如果使用的是StateListAnimator(默认情况下),则使用setElevation将无效。通过XML或编程方式设置高程(对于API>=21):
appBayLayout.setElevation(0);
在XML中设置高程时,它确实起作用。Edit
v24.0.0中的AppBarLayout
使用一个StateListAnimator
,它根据其状态定义高程。因此,如果使用的是StateListAnimator
(默认情况下),则使用setElevation
将无效。通过XML或编程方式设置高程(对于API>=21):
旧答案
这似乎是一个问题。问题与使用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);
}
}
在您的示例中使用了哪个
view
视图stateListAnimator.addState(新的int[0],ObjectAnimator.offload(视图,“标高”,0))代码>?@VolodymyrKhodonovych作为参数传递的参数我在android 21中有这样的错误>JNI在应用程序中检测到错误:无法调用void>android.view.view.setElevation(float)on nullobject@VolodymyrKhodonovych您的视图对象引用似乎为空。我使用了appBarLayout.setElevation(0)
和appBarLayout.setStateListAnimator(null)
禁用提升,而appBarLayout.setElevation(10.5)
启用提升。它在运行时和屏幕旋转后工作
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);
}
}