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



升级到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.make(rootView, getString(R.string.error_no_permissions),Snackbar.LENGTH_LONG).show();

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

编辑:

事实证明,解决方案是(如@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,只是为了减轻超级实现中的崩溃。

它的发音为:

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

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

这个问题似乎在Android支持库23.0.1(2015年9月)

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

同样的事情发生在设置content_main的布局为framayout或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不会导致崩溃。

EDIT: 23.3.0及更高版本应该也可以。我提到回到23.2.1(当时)是为了说明它在24 alpha中不能工作,但在23 alpha中可以工作。X稳定版

相关内容

  • 没有找到相关文章

最新更新