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



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

相关内容

  • 没有找到相关文章

最新更新