onTouchEvent 中的 CoordinatorLayout NullPointerException

CoordinatorLayout NullPointerException in onTouchEvent

我在 CoordinatorLayoutonTouchEvent 中得到 NullPointerException

我正在使用 DrawerLayout 和 android 的 CollapsingToolbarLayout 支持 AppCompat v23.0.0 库。

我的观察是滚动 CollapsingToolbarLayout 或单击抽屉项目时随机发生崩溃。

有人遇到这个问题吗?有什么解决方法可以避免这种异常吗?

Logcat:

08-22 15:16:34.657: E/AndroidRuntime(27596): java.lang.NullPointerException: Attempt to invoke virtual method 'float android.view.MotionEvent.getX()' on a null object reference
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.view.View.onTouchEvent(View.java:9321)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.support.design.widget.CoordinatorLayout.onTouchEvent(CoordinatorLayout.java:449)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.view.View.dispatchTouchEvent(View.java:8388)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2398)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.support.v4.widget.DrawerLayout.cancelChildViewTouch(DrawerLayout.java:1491)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.support.v4.widget.DrawerLayout$ViewDragCallback.peekDrawer(DrawerLayout.java:1739)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.support.v4.widget.DrawerLayout$ViewDragCallback.access[=10=]0(DrawerLayout.java:1624)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.support.v4.widget.DrawerLayout$ViewDragCallback.run(DrawerLayout.java:1630)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.os.Handler.handleCallback(Handler.java:739)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.os.Handler.dispatchMessage(Handler.java:95)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.os.Looper.loop(Looper.java:135)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at android.app.ActivityThread.main(ActivityThread.java:5221)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at java.lang.reflect.Method.invoke(Native Method)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at java.lang.reflect.Method.invoke(Method.java:372)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
08-22 15:16:34.657: E/AndroidRuntime(27596):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
08-22 15:16:35.965: I/Process(27596): Sending signal. PID: 27596 SIG: 9

这对我有用。 https://code.google.com/p/android/issues/detail?id=183166

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    try {
        return super.dispatchTouchEvent(ev);
    } catch (Exception e) {
        return false;
    }
}

根据 Kevin Salazar 提出的link,如果您将支持库更新到版本 23.0.1

,该错误已修复

正如 David Chu 正确解释的那样,该问题已在 23.0.1 及更高版本中得到解决。另外,就我而言,Kevin Salazar 关于尝试捕获 dispatchTouchEvent 的建议似乎降低了(可能是感知偏差)崩溃的次数,但并没有完全避免它们。

一个关键方面是崩溃并不像最初看起来那样随机。在我的例子中,当你慢慢打开抽屉时就会发生这种情况。快速打开和关闭抽屉不会导致崩溃。这对我重现错误很有帮助。