programacion - quitar boton aplicaciones android
Deshabilitar el cajón de navegación, alternar el botón de inicio/el indicador de arriba en fragmentos (5)
La puesta en marcha
Tengo una actividad cuyo contentView es una instancia de DrawerLayout
, que tiene un cajón de navegación con un indicador del cajón que se muestra en la barra de acciones. La actividad contiene un Fragment
, llamémoslo ListFragment
, que contiene una lista de opciones. Cuando se hace clic en una opción, reemplazo el ListFragment
con un DetailFragment
.
En este punto, me gustaría mostrar una opción de navegación "arriba" en lugar del indicador del cajón de navegación. Puedo mostrar el icono "arriba" si deshabilito el indicador del cajón llamando a mDrawerToggle.setDrawerIndicatorEnabled(false)
, pero esto solo elimina el ícono del cajón, no elimina la funcionalidad, es decir, cuando hago clic en Cuidado, el cajón de navegación aún está abierto.
Además, en estas subvistas, me gustaría desactivar la apertura del cajón arrastrando desde el borde de la pantalla. He intentado hacer esto llamando a setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
pero parece que no ha deshabilitado esta funcionalidad.
Intenté extender la clase ActionBarDrawerToggle
para evitar abrir el cajón cuando se hace clic en el indicador; sin embargo, todo lo que sucede es que se realiza la acción de anulación (la navegación "arriba"), pero el cajón aún se abre .
También implementé los pasos en Cambiar entre la imagen de Android Navigation Drawer y Up caret cuando uso fragmentos . Funciona en la medida en que se muestra el símbolo de intercalación, pero a pesar de anular la funcionalidad del botón de arriba, el menú aún se abre (la aplicación navega hacia atrás, sino que también abre el cajón).
Pregunta
Entonces, para resumir: ¿hay alguna forma (preferiblemente limpia y elegante, pero en este punto iré con hacky) de lograr estas cosas cuando mi raíz de diseño sea un DrawerLayout
:
- Reemplace el indicador del cajón con un
mDrawerToggle.setDrawerIndicatorEnabled(false))
"hacia arriba" (tentativamente posible mediantemDrawerToggle.setDrawerIndicatorEnabled(false))
- Evite que el cajón se abra cuando se hace clic en el símbolo de intercalación y, en su lugar, anule con mi propia funcionalidad "arriba"
- Evite que el cajón se abra cuando arrastro desde el borde de la pantalla.
Editar
De acuerdo, parece que si ActionBarDrawerToggle
AND onOptionsItemSelected
, el menú no se abre cuando hago clic en el símbolo de intercalación. Pero aún se abre si arrastro desde el borde. ¡Ayuda!
Basándose en la respuesta de @sonida Y luego de usar los ajustes dados por @ luca992 y @jai.
Intenté los códigos sugeridos anteriormente, pero la flecha "arriba" o "Atrás" en el lado izquierdo de la barra de acciones simplemente no aparecía en mi aplicación. Pero afortunadamente pude arreglar eso.
Tuve que agregar esta línea de código adicional en setNavigationDrawerState () [Ref: android.support.v7.app.ActionBarDrawerToggle.setHomeAsUpIndicator ]
toggle.setHomeAsUpIndicator (R.drawable.ic_keyboard_backspace_white_24dp);
Descargué el dibujable: ic_keyboard_backspace_white_24dp de Material.io
Aquí está el código completo:
MainActivity.java -> onCreate ()
DrawerLayout drawer;
ActionBarDrawerToggle toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Start: Code automatically generated by Android Studio
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
// End: Code automatically generated by Android Studio
// I had to add this listener as the "back" arrow was totally unresponsive
// Thanks to @luca992
toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// Start: Code automatically generated by Android Studio
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
// End: Code automatically generated by Android Studio
// More custom code for other stuff
// ...
}
MainActivity.java -> setNavigationDrawerState ()
public void setNavigationDrawerState(boolean isEnabled) {
if ( isEnabled ) {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
toggle.setDrawerIndicatorEnabled(true);
toggle.syncState();
}
else {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
toggle.setDrawerIndicatorEnabled(false);
// the extra line of code goes here
toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp);
toggle.syncState();
}
MainActivity.java -> onBackPressed ()
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else if(getSupportFragmentManager().getBackStackEntryCount() > 0){
getSupportFragmentManager().popBackStack();
}else {
super.onBackPressed();
}
}
MainActivity.java -> startFragment () [función ficticia, por ejemplo]
public void startFragment(){
MyFrag myFrag = new MyFrag();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frag_container ,myFrag)
.addToBackStack(null)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}
MyFrag.java -> onViewCreated ()
@Override
public void onViewCreated (View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
// Say, using an implemented interface Make call to MainActivitiy''s setNavigationDrawerState() passing false
// setNavigationDrawerState(false)
// ...
}
MyFrag.java -> onDestroyView ()
@Override
public void onDestroyView(){
// Say, using an implemented interface Make call to MainActivitiy''s setNavigationDrawerState() passing true
// setNavigationDrawerState(true)
super.onDestroyView();
}
Basándose en la respuesta de Sonida. Después de llamar a setDrawerIndicatorEnabled (false), onNavigateUp no se estaba llamando todavía. Entonces, acabo de crear un nuevo OnClickListener que lo llamó:
public void setDrawerState(boolean isEnabled) {
if ( isEnabled ) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
drawerToggle.setDrawerIndicatorEnabled(true);
drawerToggle.syncState();
}
else {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawerToggle.setDrawerIndicatorEnabled(false);
drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSupportNavigateUp();
}
});
drawerToggle.syncState();
}
}
también creo
drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
ha sido depreciado, pero funciona bien sin él.
Código corto
public void setDrawerState(boolean isEnabled) {
if ( isEnabled ) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
drawerToggle.setDrawerIndicatorEnabled(true);
drawerToggle.syncState();
}
else {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawerToggle.setDrawerIndicatorEnabled(false);
drawerToggle.syncState();
}
}
Debes deshabilitar deslizar y deshabilitar el botón de inicio de la barra de acciones:
Utilice el siguiente código que se basa en el código ya proporcionado para deshabilitar deslizar
public void setDrawerState(boolean isEnabled) {
if ( isEnabled ) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
getActivity().getActionBar().setHomeButtonEnabled(true);
}
else {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerToggle.syncState();
getActivity().getActionBar().setHomeButtonEnabled(false);
}
}
Esto es solo una parte de la solución a la que llegué, pero fue bastante difícil descubrir este error, así que lo dejo aquí por el bien de la posteridad.
Así es como estaba definiendo el ListView para mi cajón de navegación:
<ListView
android:id="@+id/listview_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start|bottom"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
Incluso después de llamar a setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
pude abrir el cajón.
Sin embargo, después de cambiar el layout_gravity
para "start"
este problema parece estar resuelto.
Pude reproducir este problema en una aplicación de muestra, de solo cajón de navegación, por lo que parece ser un problema reproducible que no es exclusivo de mi situación.