DrawerLayout – Excepción que envía el evento de entrada
Recientemente empecé a usar el DrawerLayout en un nuevo proyecto hace una semana y todo funciona bien. Aparte de los momentos extraños al pasarlo adentro y afuera con mi dedo, se estrellará.
Si utilizo el ActionBar Up / Home MenuItem, sin embargo, funcionará bien cada vez.
- ¿Cómo puedo descargar una versión antigua de la biblioteca de soporte de Android?
- Cómo utilizar AutoScrollHelper
- RequiereApi vs TargetApi anotaciones android
- Androide, diseño, biblioteca, gradle, nulo, puntero, excepción
- Añadir dependencia gradle para dar soporte a android.util.ArrayMap
En LogCat consigo dos stacktraces que parecen apuntar a los lugares androides internos, así que no sé muy bien qué hacer para solucionar esto.
Acabo de intentar crear una nueva aplicación para ver si era algo que estaba haciendo antes de que estaba causando esto, pero sucedió en la nueva aplicación también.
He creado la nueva aplicación con la plantilla de flujo maestro / detalle en la ventana "Nueva aplicación de Android", dejé todo como valores predeterminados y sólo cambié activity_item_list.xml para tener esto dentro de él:
<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>
El DrawerLayout muestra y todavía puedo arrastrarlo desde el borde de la pantalla, pero todavía se bloquea en esta aplicación de prueba.
Aquí están los stacktraces que veo después de arrastrar con mi dedo:
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)
¿Hay algo que me falta aquí?
Editar: 10 días en y todavía no puede averiguar esto, ¿puedo al menos obtener la confirmación de que esto no es sólo para mí conseguir esto?
- ¿Por qué no funcionan las bibliotecas de soporte de Android en mi proyecto?
- Los fragmentos anidados desaparecen durante la animación de transición
- Android ViewPager con páginas anteriores y siguientes visibles?
- Colorear botones en Android con AppCompat
- IntelliJ y android.support.v7.widget.GridLayout
- Android DialogFragment no descarta
- Adición de bibliotecas de soporte técnico al proyecto de Android
- Personalizar el relleno de las pestañas de ActionBar
También tengo este mensaje de error pero al principio no pude averiguar qué lo causó. Después de hacer algunas pruebas en realidad me enteré de que la eliminación de todos los márgenes en la vista (en su ejemplo, el fragmento) parece eliminar el problema.
Así que en su caso sería:
<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" />
Y puede establecer márgenes en todas las vistas dentro de este fragmento en su lugar (pero no lo he probado). Espero que ayude a alguien. Parece que este problema no es tan común.
Creo que he conseguido arreglar esto creando mis propias copias de los archivos que necesitaba del código fuente de la biblioteca de soporte y capturando la vista null en isContentView()
.
Los archivos que necesitaba de la fuente eran:
- ActionBarDrawerToggle.java
- ActionBarDrawerToggleHoneycomb.java
- DrawerLayout.java
Los puse en su propio paquete en mi proyecto y DrawerLayout
nombre de DrawerLayout
a FixedDrawerLayout
. (Así que puedo decir fácilmente qué copia del DrawerLayout que estoy usando)
Entonces cambié isContentView()
a:
boolean isContentView(View child) { if(child == null){ return false; } return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; }
Después de intercambiar todas las referencias a la DrawerLayout
en mi Activity
a FixedDrawerLayout
parece haberlo arreglado.
No estoy seguro si hay algo que puede suceder simplemente devolviendo false
en isContentView()
, pero no se isContentView()
más y todavía es utilizable incluso cuando el child
es nulo.
Sobre la base de la respuesta de Mike y el comentario de user1050133:
1) Crea el paquete android.support.v4.widget
en tu aplicación
2) Agregue un nuevo archivo llamado FixedDrawerLayout
con el siguiente contenido:
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) Reemplazar todos los usos de DrawerLayout en xml con FixedDrawerLayout
Me enfrenté con un problema similar.
Puse una falsa onclick mathod para el diseño del fragmento
<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" >
Puse el método onclick en el código de actividad java sólo por falso.
public void fragmentClick(View v){ Log.i("fragmentClick", "fragmentClick"); return; }
El problema fue resuelto.
Tuve el mismo problema al usar el cajón de navegación, y he resuelto el problema simplemente eliminando el android:focusableInTouchMode="true"
del diseño raíz del fragmento.