4

触摸崩溃升级到设计支持库23.0.0和建立SDK 23后,我的应用程序崩溃,当我试图驳回SnackbarAndroid的小吃吧与设计支持库23.0.0

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) 

我的天堂” T改为任何事情,因为更新和我使用的唯一途径,我知道关闭显示小吃吧:

Snackbar.make(rootView, getString(R.string.error_no_permissions),Snackbar.LENGTH_LONG).show(); 

有报道NPE上CoordinatorLayout一个问题,可能与: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()); 
+1

如果您查看已链接的故障单,您可能会注意到它标记为“FutureRelease”,表示问题已修复,但尚未发布。从8月20日星期四发表的评论来看,“我们希望尽快获得一个修补程序”,希望很快就会有一个发布来解决这个问题。否则,看起来最好的行动方式可能是回到api 22,或者在解决方案发布前忽略问题。 –

+0

看起来像这样,但恐怕Snackbar问题不会得到解决,因为建议的解决方法无法解决问题。无论如何,我想你是对的,最好是如果我回到设计支持22.2.1的生产和构建SDK 22,但这是一个问题,因为我开始准备我的Android M应用程序... –

+0

那么,你可以继续为23.0.0做准备,并且在修复发布之前暂时忽略错误,这将在Android M实际发布给用户之前有望实现。那样你就不会落后于此。如果它确实出来,你只需要建立22 –

回答

3

另一个修复暂时被重写AppBarLayout.BehavioronInterceptTouchEvent和无效的或空MotionEvent被丢弃,只是为了缓解超级实现中的崩溃。

这将作为回荡:

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

对于MotionEvent那可能是无效的,我们不会做任何事情,所以我们做了继承Behavior认为我们怎样处理这件事。

+5

实际上它是:“return ev == null || super.onInterceptTouchEvent(parent,child,ev);”因为这样:“return ev!= null?super.onTouchEvent(parent,child,ev):true;”并不会传播... –

1

这个问题似乎通过设置小吃吧的观点是固定在Android的支持库23.0.1(2015年9月)

+0

是的,它应该是,它适用于我,但仍有一些崩溃报告问题跟踪器23.0.1 - 可能是设备特定的... –

+1

我有同样的问题它通过使用支持库23.1.1上的Android支持库23.0.1 –

+0

问题得到修复 – goonerDroid

1

我工作围绕这(在支持库24阿尔法和Androidñ预览)来引用我content_main .xml的布局ViewGroup而不是我的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 ...)的视图更改为你的最内层布局(或其他视图),看看是否能解决它。

不幸的是,这导致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 stable版本中工作。