升级到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());
答案 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稳定版本。