android - ejemplo - ¿Qué necesita para pasar a v4.widget.DrawerLayout.isDrawerOpen()/. OpenDrawer()/. CloseDrawer()
navigation drawer material design (4)
En su Actividad, si tiene una referencia al DrawerLayout y en este caso el FrameLayout con el id R.id.menuPane, también puede hacer ...
DrawerLayout mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
FrameLayout mMenuPane = (FrameLayout) findViewById(R.id.menuPane);
mMenuPanel.isDrawerOpen(mMenuPane);
Básicamente, tiene que pasar una referencia a la vista que se utiliza como cajón dentro del DrawerLayout, que siempre será mMenuPanel.getChildAt (1) de todos modos.
He estado intentando mover mi código a DrawerLayout
tal como lo sugiere Android here ya que SlidingDrawer
está en desuso.
Mi problema es que hasta ahora DrawerLayout
parece estar muy mal implementado, tiene mensajes de error poco útiles (no hay programación defensiva) y / o no está lo suficientemente bien explicado en la documentación.
El método isDrawerOpen()
se describe here :
public boolean isDrawerOpen (cajón de vista)
Compruebe si la vista del cajón dado está actualmente en un estado abierto. Para ser considerado "abierto", el cajón debe haberse colocado en su estado completamente visible. Para verificar la visibilidad parcial, use isDrawerVisible (android.view.View).
Parámetros: cajón - Vista del cajón para comprobar
Devuelve: verdadero 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 pasan: The DrawerLayout
en cuestión o cualquiera de sus hijos. No tengo idea de lo que se supone que debo incluir en estos métodos para permitir que funcionen. ¿Alguien puede dejarme saber?
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 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
(Como verás, no te da ninguna información sobre lo que hiciste mal. En cambio, es un síntoma del problema).
Otras respuestas here o here son incomprensibles o están muy ligadas a la pregunta sin mucha explicación. Aun así, he intentado agregar un LinearLayout
falso o uno de los hijos de DrawerLayout
y cada uno da este error:
E/AndroidRuntime(11424): java.lang.IllegalArgumentException:
View android.widget.FrameLayout{420f5ea8 V.E..... ........
0,0-800,1172 #7f060038 app:id/menuPane} is not a drawer
¿Alguien puede explicar lo que estos métodos realmente deben haberles pasado para que funcionen?
Si desea evitar referencias a vistas o diseños para llamar a isDrawerOpen , se puede aplicar otra forma.
En este caso hay que indicar la Gravedad:
mDrawerLayout.isDrawerOpen(Gravity.START);
Siendo mDrawerLayout una referencia a su DrawerLayout.
como dijiste, no olvides android:layout_gravity="start"
Si está utilizando el diseño de cajón de la biblioteca de soporte como podemos ver en su pregunta que está, también existe el método:
closeDrawers()
Esto cerrará todos los cajones abiertos (que normalmente es solo uno).
Y, la respuesta:
El segundo hijo (también conocido como el "Cajón") es lo que debe pasarse a los métodos. Mi problema era que, cuando me di cuenta de que había reducido el diseño a la implementación más sencilla posible para probar, había eliminado la gravedad del "cajón". Sin una gravedad, obtienes los mensajes de error completamente relacionados que no están relacionados.
Puedo confirmar que tengo el código para trabajar con la siguiente configuración:
mMenuPanel.isDrawerOpen(findViewById(R.id.drawer));
y con el diseño:
<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>