4

升级到设计支持库 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();

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

编辑: 原来解决方案是(正如@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());
4

3 回答 3

3

onInterceptTouchEvent暂时的另一个修复是覆盖AppBarLayout.Behavior和无效或 nullMotionEvent被丢弃,只是为了减轻超级实现中的崩溃。

这听起来像:

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

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

于 2015-08-24T23:02:33.770 回答
1

该问题似乎已在 Android 支持库 23.0.1(2015 年 9 月)中得到修复

于 2015-09-15T19:06:28.430 回答
1

我通过将 SnackBar 的视图设置为引用我的content_main .xml 布局 ViewGroup 而不是我的activity_main .xml 布局 ViewGroup (CoordinatorLayout)来解决这个问题(在 Support library 24 alpha 和 Android N Preview 中)。

将 content_main 的布局设置为 FrameLayout 或 CoordinatorLayout 时发生了同样的事情。

(Android Studio 的带有 FAB 的 Activity 模板使用 android.support.design.widget.CoordinatorLayout 作为 Activity_Main 中的布局,并提供第二个 xml 文件 content_main,供您将视图等放入第二个布局中(通常) 在 content_main 中。)

如果您在触摸/移动 Snackbar 时遇到崩溃问题,您可以尝试将传递给 Snackbar.make(layoutViewName...) 的视图更改为最里面的布局(或其他视图)并查看如果这解决了它。

不幸的是,这导致位于 activity_main 中的 FAB 没有像 SnackBar 进入视野时那样向上移动。

我不得不恢复到 23.2.1 和 API 23。那时不需要解决方法。然后,我可以将 activity_main 的 CoordinatorLayout 作为 SnackBar.make(view...) 中的第一个参数引用。FAB 按预期向上移动,并且滑动 SnackBar 并不会导致崩溃。

编辑:23.3.0 及更高版本也应该没问题。我提到(当时)恢复到 23.2.1 的意图是要注意它不能在 24 alpha 中工作,而是在 23.x 稳定版本中工作。

于 2016-03-17T07:37:06.217 回答