11

我最近開始在一個新的項目中使用DrawerLayout約一個星期前,它都工作正常。除了用手指滑入和滑出的奇怪時刻,它會崩潰。DrawerLayout - 異常調度輸入事件

如果我使用ActionBar Up/Home MenuItem,但它每次都能正常工作。

在LogCat中,我得到了兩個似乎都指向內部android位置的堆棧軌跡,所以我不知道該怎麼做來解決這個問題。

我剛剛嘗試創建一個新的應用程序,看看它是否是我之前正在做的事情,這是造成這種情況,但它也發生在新的應用程序中。

我創建了在「新Android應用程序」窗口中的主/詳細流程模板的新的應用程序,捨棄了一切爲默認值,只是改變activity_item_list.xml有這個裏面:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <fragment 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/item_list" 
     android:name="com.navdrawertest.ItemListFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     tools:context=".ItemListActivity" 
     tools:layout="@android:layout/list_content" /> 

    <!-- Navigation Drawer --> 
    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#111" /> 
</android.support.v4.widget.DrawerLayout> 

的DrawerLayout顯示,我仍然可以從屏幕邊緣拖動它,但它仍然在這個測試應用程序崩潰。

下面是我看到蹤跡用手指拖動後:

07-26 09:29:45.574: E/InputEventReceiver(19085): Exception dispatching input event. 
07-26 09:29:45.574: E/MessageQueue-JNI(19085): Exception in MessageQueue callback: handleReceiveCallback 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): java.lang.NullPointerException 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.support.v4.widget.DrawerLayout.isContentView(DrawerLayout.java:840) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:866) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1852) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.app.Activity.dispatchTouchEvent(Activity.java:2424) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.View.dispatchPointerEvent(View.java:7564) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.os.MessageQueue.nativePollOnce(Native Method) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.os.MessageQueue.next(MessageQueue.java:132) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.os.Looper.loop(Looper.java:124) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at java.lang.reflect.Method.invokeNative(Native Method) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at java.lang.reflect.Method.invoke(Method.java:525) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-26 09:29:45.584: E/MessageQueue-JNI(19085): at dalvik.system.NativeStart.main(Native Method) 
07-26 09:29:45.584: D/AndroidRuntime(19085): Shutting down VM 
07-26 09:29:45.584: W/dalvikvm(19085): threadid=1: thread exiting with uncaught exception (group=0x41cbb700) 
07-26 09:29:45.594: E/AndroidRuntime(19085): FATAL EXCEPTION: main 
07-26 09:29:45.594: E/AndroidRuntime(19085): java.lang.NullPointerException 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.support.v4.widget.DrawerLayout.isContentView(DrawerLayout.java:840) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:866) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1852) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.app.Activity.dispatchTouchEvent(Activity.java:2424) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.View.dispatchPointerEvent(View.java:7564) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.os.MessageQueue.nativePollOnce(Native Method) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.os.MessageQueue.next(MessageQueue.java:132) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.os.Looper.loop(Looper.java:124) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at java.lang.reflect.Method.invokeNative(Native Method) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at java.lang.reflect.Method.invoke(Method.java:525) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-26 09:29:45.594: E/AndroidRuntime(19085): at dalvik.system.NativeStart.main(Native Method) 

有我丟失的東西嗎?

編輯:10天后仍然無法弄清楚,我至少可以得到確認,這不僅僅是我得到這個嗎?

回答

11

我也有這個錯誤消息,但起初我無法找出是什麼原因造成的。 做了一些測試後,我實際上發現刪除視圖上的所有邊距(在你的例子中的片段)似乎消除了這個問題。

所以你的情況這將是:

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/item_list" 
    android:name="com.navdrawertest.ItemListFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".ItemListActivity" 
    tools:layout="@android:layout/list_content" /> 

,你可以在這個片段裏各方面的意見設置頁邊距來代替(但我沒有測試過)。 希望它可以幫助別人。看來這個問題並不常見。

+0

這感覺像一個奇怪的解決方案,但它實際上幫助了我,謝謝! –

+0

很高興它有幫助,沒有太多關於這個的文檔,所以我想這是一個相當新的「bug」(它聽起來至少是一個錯誤)。 – MintL

+0

玩過Android Studio創建的示例後,它工作得很好,碎片上沒有任何邊距。所以這一定是最初導致我的問題。所以我會將其設置爲接受的答案。 – Mike

8

我想我已經設法解決這個問題,通過從支持庫源代碼創建我自己需要的文件副本,並捕獲isContentView()中的null View。

我從源所需的文件爲:

  • ActionBarDrawerToggle.java
  • ActionBarDrawerToggleHoneycomb.java
  • DrawerLayout.java

我把它們放在自己的包在我的項目並將其更名爲DrawerLayoutFixedDrawerLayout。 (所以我可以很容易地告訴我使用該DrawerLayout複印件)

我再變isContentView()到:

boolean isContentView(View child) { 
    if(child == null){ 
     return false; 
    } 
    return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; 
} 

在交換到DrawerLayout所有引用後,我的ActivityFixedDrawerLayout它似乎已經解決它。

不知道有什麼可以由剛剛在isContentView()返回false發生,但現在不崩潰,它仍然可以使用,即使child爲空。

+0

只是一個小提示在XML替換DrawerLayout的所有用途。您不需要複製任何文件。由於isContentView是私有包,因此您只需將DrawerLayout繼承爲與原始包相同的包結構。你最終得到一個覆蓋該方法的類android.support.v4.widget.RepairedDrawerLayout,如果該子元素爲null,則返回false。 BTW:如果孩子爲空,您也可以在這裏調用closeAllDrawers()來關閉導航抽屜。 – user1050133

+0

謝謝,很高興知道!我不知道我可以這樣子類。 – Mike

+0

謝謝,爲我工作。平凡的bug對谷歌:( –

1

我有同樣的問題,同時使用導航抽屜,我已經從片段的根佈局取出android:focusableInTouchMode="true"簡單地解決了這個問題。

2

我面臨類似的問題。

我放個假的onclick馬託的片段佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#f1f2f6" 
    android:onClick="fragmentClick" 
    android:orientation="vertical" > 

我放的onclick方法在活動的Java代碼只是假的。

public void fragmentClick(View v){ 
    Log.i("fragmentClick", "fragmentClick"); 
    return; 
} 

問題解決了。

+1

這很簡單,爲我工作。 –

4

大廈邁克的回答和user1050133的評論:

1)在你的應用

2)添加一個名爲FixedDrawerLayout新的文件,內容如下創建包android.support.v4.widget

public class FixedDrawerLayout extends DrawerLayout { 

    public FixedDrawerLayout(Context context) { 
     super(context); 
    } 

    public FixedDrawerLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public FixedDrawerLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    boolean isContentView(View child) { 
     if (child == null) { 
      return false; 
     } 
     return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; 
    } 
} 

3 )與FixedDrawerLayout