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

时间:2015-08-24 18:55:25

标签: 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());

3 个答案:

答案 0 :(得分:3)

暂时的另一个修复是覆盖onInterceptTouchEvent的{​​{1}}和无效或空AppBarLayout.Behavior被丢弃,只是为了缓解超级实现中的崩溃。

那会响起:

MotionEvent

对于可能无效的@Override public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev){ return ev != null ? super.onInterceptTouchEvent(parent,child, ev) : true; } ,我们不会对此做任何事情,因此我们认为继承的MotionEvent认为我们已经处理了它。

答案 1 :(得分:1)

此问题似乎已在Android支持库23。0。1(2015年9月)

中修复

答案 2 :(得分:1)

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

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

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

如果您在触摸它/移动它时遇到Snackbar崩溃的问题,您可以尝试将传递给Snackbar.make(layoutViewName ...)的视图更改为最内层布局(或某些布局)其他视图),看看是否能解决它。

不幸的是,这导致了活动网络中的FAB在SnackBar进入视图时不会向上移动。

我不得不回到23.2.1和API 23.然后不需要解决方法。然后我能够将activity_main的CoordinatorLayout作为SnackBar.make中的第一个参数引用(视图...).FAB按原样向上移动并轻扫SnackBar不会导致崩溃。

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