programacion - manual android studio avanzado
Cómo abrir el Cajón de navegación sin barra de acciones, abrir con solo un botón (5)
Tengo una barra de navegación sin barra de acciones (no quiero una barra de acciones). Estoy tratando de hacerlo para que tenga un botón que pueda abrir el cajón de navegación.
Sé que hay un método llamado openDrawer para DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)
No sabía cómo usarlo, pero intenté hacer un botón al hacer clic, ejecuta este método:
DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);
Cuando hago clic en él, me da una Java NullPointerException. ¿Alguien tiene alguna idea?
EDITAR: Este código está dentro de un fragmento, y estoy tratando de referir el diseño del cajón fuera del fragmento. Usé el depurador, y muestra que mDrawlerLayout es NULL.
¿Algún consejo?
¡Gracias!
Escribí una respuesta sobre esto aquí: https://.com/a/18199771/880349
//For me a better way in avoiding a `null pointer` in getting the DrawerLayout
final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//Opens the Drawer
drawer.openDrawer(Your View, Usually a ListView);
}
return false;
});
Obtienes directamente el cajón actual dentro de una vista / fragement para que no obtengas una NullPointerException
Gracias a @athor y @Ashish Tana.
Me llevó mucho tiempo descubrir el error ( NullPointerException
) que estoy recibiendo.
El mío funciona de esta manera; En lugar de getView()
, uso getActivity()
y abro el cajón mediante mDrawerLayout.openDrawer(Gravity.LEFT);
.
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu);
btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDrawerLayout.openDrawer(Gravity.LEFT);
}
});
Le proporciona un puntero nulo porque está intentando encontrar el diseño del cajón en la vista del fragmento, cuando está realmente en la vista de actividades.
Un truco rápido para hacer lo que quieras es encontrar la vista como:
getActivity().findViewById(R.id.drawer_layout)
Eso debería funcionar. Una mejor manera es tener un método sobre la actividad para abrir el cajón
public void openDrawer(){
mDrawerLayout.openDrawer(mDrawerLayout);
}
En la actividad de crear, ejecuta tu findViewById:
mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout debe ser una variable miembro de tu actividad.
Luego en tu fragmento puedes llamar:
//cast activity to MyActivity so compiler doesn''t complain
((MyActivity)getActivity()).openDrawer();
Una forma aún mejor de hacerlo es crear un oyente en el fragmento y establecer la actividad como oyente del fragmento. Luego puede llamar a un método sobre la actividad, similar al anterior. Te dejaré hacer una investigación sobre cómo hacer eso.
drawerLayout.openDrawer(Gravity.START);
Funciona al hacer clic en el botón
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
drawer.openDrawer(GravityCompat.START);
}
});