如何在Android Support Library v24.0.0中以编程方式设置AppBarLayout的高程?

bry*_*410 18 android android-support-library android-support-design

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

appBayLayout.setElevation(0);
Run Code Online (Sandbox Code Playgroud)

在XML中设置高程时它确实有效.

bry*_*410 26

编辑

AppBarLayout从v24.0.0使用StateListAnimator,定义根据其状态高程.因此,setElevation如果StateListAnimator正在使用a(默认情况下会发生),则使用将无效.设置elevation经由XML或以编程方式(无论对于API> = 21):

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

老答案

这似乎是设计支持库的一个问题.问题与使用编程方式设置高程的方式有关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);
}
Run Code Online (Sandbox Code Playgroud)

这取自构造函数的作用,ViewUtilsLollipop在v24.0.0中调用类中的方法.

  • 我在Android 21中有这样的错误>应用程序中的JNI DETECTED ERROR:无法在null对象上调用void> android.view.View.setElevation(float) (2认同)

Vol*_*myr 8

另一个可能的解决方案是添加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">
Run Code Online (Sandbox Code Playgroud)

  • 我使用了“appBarLayout.setElevation(0)”和“appBarLayout.setStateListAnimator(null)”来禁用海拔,并使用“appBarLayout.setElevation(10.5)”来启用。它在运行时和屏幕旋转后工作 (2认同)