如何在Android支持库v24.0.0中以编程方式设置AppBarLayout的高程?

如何在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):

从Android支持库v23.4.0升级到v24.0.0时,以编程方式将AppBarLayout的提升设置为0将停止工作:

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);
    }
}