¿Qué necesitas para pasar a v4.widget.DrawerLayout.isDrawerOpen () /. OpenDrawer () /. CloseDrawer ()

He estado tratando de mover mi código a través de la DrawerLayout como se sugiere por Android aquí como SlidingDrawer es obsoleto.

Mi problema es que hasta ahora DrawerLayout parece estar muy mal implementado, tiene mensajes de error inútiles (no hay programación defensiva) y / o no se explica lo suficiente en la documentación.

El método isDrawerOpen() se describe aquí :

Public boolean isDrawerOpen (Ver cajón)

Compruebe si la vista de cajón dada se encuentra actualmente en un estado abierto. Para ser considerado "abierto" el cajón debe haber establecido en su estado plenamente visible. Para comprobar la visibilidad parcial use isDrawerVisible (android.view.View).

Parámetros: cajón – Vista del cajón para comprobar

Devuelve: true si la vista de cajón dada está en un estado abierto

Cada uno de los métodos isDrawerOpen(View drawer) , openDrawer(View drawer) y closeDrawer(View drawer) no funcionan cuando se pasa: El DrawerLayout en cuestión o cualquiera de sus hijos. No tengo ni idea de lo que se supone que debo alimentar en estos métodos para permitirles funcionar. ¿Puede alguien decirme?

Vea a continuación la descripción completa del problema con la implementación.

Tengo un diseño así:

 <android.support.v4.widget.DrawerLayout android:id="@+id/mainmenuPanel" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/dualPane" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/menuPane" android:layout_width="300dp" android:layout_height="match_parent" /> </android.support.v4.widget.DrawerLayout> 

Y en mi código tengo el siguiente método conectado a un botón:

 protected void onCreate(Bundle savedInstanceState) { ... mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel); .... } public boolean isDrawerOpen() { if(mMenuPanel != null) { return mMenuPanel.isDrawerOpen(mMenuPanel); } return false; } 

Sin embargo, si se lo da a sí mismo como un argumento (que sería redundante en el extremo) obtendrá el siguiente error:

 E/AndroidRuntime(11241): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams 

(Que como te darás cuenta, no te da ninguna información sobre lo que hiciste mal. Es en cambio un símbolo del problema).

Otras respuestas aquí o aquí son incomprensibles o muy estrechamente vinculadas a la pregunta sin mucha explicación. Aun así he intentado agregar un falso LinearLayout o uno los niños de DrawerLayout s y cada uno dar este error:

 E/AndroidRuntime(11424): java.lang.IllegalArgumentException: View android.widget.FrameLayout{420f5ea8 VE.... ........ 0,0-800,1172 #7f060038 app:id/menuPane} is not a drawer 

¿Puede alguien explicar lo que estos métodos realmente necesitan haber pasado a ellos para trabajar?

Y, la respuesta:

El segundo niño (aka, el "cajón") es lo que necesita ser pasado a los métodos. Mi problema era que en el momento en que había pensado que había reducido el diseño a la aplicación más simple posible para probar – que había quitado la gravedad de la "gaveta". Sin una gravedad, obtendrá los mensajes de error anteriormente no relacionados.

Puedo confirmar que conseguí el código para trabajar usando la disposición siguiente:

 mMenuPanel.isDrawerOpen(findViewById(R.id.drawer)); 

Y con la disposición:

 <android.support.v4.widget.DrawerLayout android:id="@+id/mainmenuPanel" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/drawer" android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="start"/> <!-- This line was the problem!!!!!!!--> </android.support.v4.widget.DrawerLayout> 

Si desea evitar referencias a vistas o diseños para llamar a isDrawerOpen , puede aplicarse otra forma.

En este caso tiene que indicar la gravedad:

 mDrawerLayout.isDrawerOpen(Gravity.START); 

Being mDrawerLayout una referencia a su DrawerLayout.

Como has dicho, no te olvides de android:layout_gravity="start"

En tu Actividad si tienes una referencia a la DrawerLayout y en este caso la FrameLayout con la ID R.id.menuPane también puedes hacer …

 DrawerLayout mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel); FrameLayout mMenuPane = (FrameLayout) findViewById(R.id.menuPane); mMenuPanel.isDrawerOpen(mMenuPane); 

Básicamente tienes que pasar una referencia a la vista que se utiliza como el cajón dentro de la DrawerLayout, que siempre será mMenuPanel.getChildAt (1) de todos modos.

Si está utilizando el diseño de cajones de la biblioteca de soporte como podemos ver de su pregunta que usted es, también hay el método:

 closeDrawers() 

Esto cerrará todos los cajones abiertos (que normalmente es el único).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.