Android SnackBar 在与设计支持库 23.0.0 接触时崩溃

标签 android android-design-library android-support-design android-snackbar

升级到 Design Support Library 23.0.0 并构建 SDK 23 后,我的应用程序在我尝试关闭 Snackbar 时崩溃:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.MotionEvent.getAction()' on a null object reference
            at android.support.design.widget.AppBarLayout$Behavior.onInterceptTouchEvent(AppBarLayout.java:729)
            at android.support.design.widget.AppBarLayout$Behavior.onInterceptTouchEvent(AppBarLayout.java:629)
            at android.support.design.widget.CoordinatorLayout.performIntercept(CoordinatorLayout.java:357)
            at android.support.design.widget.CoordinatorLayout.onInterceptTouchEvent(CoordinatorLayout.java:409)

自更新以来我没有改变任何东西,我使用我所知道的唯一方式来显示 Snackbar:

Snackbar.make(rootView, getString(R.string.error_no_permissions),Snackbar.LENGTH_LONG).show();

CoordinatorLayout 上的 NPE 报告了一个可能相关的问题:CoordinatorLayout NullPointerException in onTouchEvent但我仍然找不到适合我情况的解决方法。我试过这个possible solution但仍然没有运气......

编辑: 原来解决方案是(正如@NikolaDespotoski 所建议的那样)覆盖默认的 AppBarLayout.Behavior

public class AppBarLayoutBehavior extends AppBarLayout.Behavior {

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child,
            MotionEvent ev) {
        return !(parent != null && child != null && ev != null) || super
                .onInterceptTouchEvent(parent, child, ev);
    }
}

...并在我们的 AppBarLayout

中使用它
((CoordinatorLayout.LayoutParams) findViewById(R.id.appbar).getLayoutParams())
                .setBehavior(new AppBarLayoutBehavior());

最佳答案

目前的另一个修复是覆盖 AppBarLayout.BehavioronInterceptTouchEvent 并丢弃无效或 null MotionEvent,只是为了减轻在 super 实现中崩溃。

这听起来像:

@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev){
   return ev != null ? super.onInterceptTouchEvent(parent,child, ev) : true;
}

对于可能无效的MotionEvent,我们不会对其做任何处理,所以我们让继承的Behavior认为我们已经处理了它。

关于Android SnackBar 在与设计支持库 23.0.0 接触时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189657/

相关文章:

java - 如何使用 Android map 创建具有自定义分辨率的纬度范围

android - 混合与本地移动应用

Android 设计支持库 - CollapsingToolbarLayout EnterAlwaysCollapsed

android.support.design.widget.NavigationView 膨胀问题(目标 api 23,最小 api 10)

android - 如何在 BroadcastReceiver 中添加 Snackbars?

android - 当滚动太远时,如何防止 RecyclerView 为每个中间子运行 onBindViewHolder

android - 如何在 Kotlin 中使用 Dagger 的 2 @Named 限定符

android - 带有 AppBarLayout 和工具栏的新 Android 设计库错误

android - 在 android 中删除或隐藏标题导航 View

android - 中心底部导航栏图标