【问题标题】:Android SnackBar crashes on touch with design support library 23.0.0Android SnackBar 与设计支持库 23.0.0 接触时崩溃
【发布时间】:2015-11-18 07:27:39
【问题描述】:

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

【问题讨论】:

  • 如果您查看已链接的票证,您可能会注意到它被标记为“FutureRelease”,这意味着该问题已修复,只是尚未发布。从 8 月 20 日星期四发表的评论来看,“我们正在寻求尽快发布修补程序”,希望很快会有一个版本来解决这个问题。否则,似乎最好的做法可能是回到 api 22,或者在修复发布之前忽略该问题。
  • 看起来很像,但我担心 Snackbar 问题不会得到解决,因为建议的解决方法不能解决它。无论如何,我想你是对的,如果我回去为生产设计支持 22.2.1 并构建 SDK 22,那将是最好的,但这是一个问题,因为我开始为 Android M 准备我的应用程序......
  • 好吧,您可以继续为 23.0.0 做准备并暂时忽略该错误,直到发布修复程序,这有望在 Android M 实际发布给用户之前。这样你就不会在那个意义上落后。如果它真的出来了,你只需要建造 22 年
  • 如何减轻无效/空运动事件?继承 AppBarLayout 并避免在 onInterceptTouchEvent 方法中将空运动事件流式传输到超级实现,直到谷歌发布对此的修复。
  • 这就是我要找的。谢谢@NikolaDespotoski 原来我只需要覆盖 AppBarLayout.Behavior onInterceptTouchEvent 并将其设置为我的 AppBarLayout...

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


【解决方案1】:

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

这听起来像:

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

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

【讨论】:

  • 其实是:"return ev == null || super.onInterceptTouchEvent(parent, child, ev);"因为这个:“返回ev!= null?super.onTouchEvent(parent,child,ev):true;”根本不传播触摸......
【解决方案2】:

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

【讨论】:

  • 是的,它应该是,它对我有用,但在 23.0.1 的问题跟踪器上仍然报告了一些崩溃 - 可能是特定于设备的......
  • 我遇到了同样的问题,它是通过使用 Android 支持库 23.0.1 修复的
  • 支持库 23.1.1 上的问题
【解决方案3】:

我通过将 SnackBar 的视图设置为引用我的 content_main.xml 布局 ViewGroup 而不是我的 activity_main 解决了这个问题(在支持库 24 alpha 和 Android N 预览版中)。 xml布局ViewGroup(CoordinatorLayout)。

将 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-12-29
    • 2015-10-19
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多