Navegación posterior con Fragmentos / Barra de herramientas

Estoy rascando mi cabeza con este ahora …. Tengo un ActionBarActivity que carga un Fragment inicial – el menú original se infla dentro de la actividad. Ahora, tengo una barra de navegación que, cuando se selecciona un elemento, carga un fragmento diferente y agrega esto al backstack.

Cuando hago esto, hay un par de cosas que quiero establecer:

  1. Establecer la casa como indicador de arriba
  2. Invalidar el menú de opciones de la actividad principal
  3. El conjunto tiene opciones a true para el fragmento
  4. Asegúrese de que el indicador hacia arriba vuelva correctamente al fragmento original

Algo bastante extraño está sucediendo – el indicador de arriba aparece una sola vez y no se comporta como el botón de regreso y aunque he invalidado e inflado un nuevo menú, el nuevo menú se agrega al menú de actividad original.

EDIT: Ok He resuelto el problema menu.clear() – se olvidó de agregar menu.clear() en el método onCreateOptionsMenu .

Mi diseño de cajón de navegación tiene métodos onClick a todos los elementos del menú que desencadenarían la carga de otro Fragmento:

 public void navItemClick(View view) { switch (view.getId()) { case R.id.ripSMS: mNavigationDrawer.toggleHome(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); FragmentTransaction mTrans = getSupportFragmentManager().beginTransaction(); mTrans.replace(R.id.voiceover_frame_layout,new MessageFragment(),"main_ui") .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack("msg").commit(); break; case R.id.ripEmail: break; case R.id.ripSettings: break; } mNavigationDrawer.closeDrawer(); } 

ToggleHome:

 public void toggleHome(boolean show) { mDrawerToggle.setDrawerIndicatorEnabled(show); if (!show) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); } } 

Una vez que el elemento se desencadena el onCreate contiene el invalidate y el código hasOptions:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActivity().invalidateOptionsMenu(); setHasOptionsMenu(true); } 

El onCreateOptionsMenu luego infla otro diseño de menú (contiene un único elemento denominado configuración).

Como se mencionó, esto sólo funciona parcialmente una vez – la primera vez que uso el elemento para cargar el fragmento, recibo el icono de nuevo, pero también no funciona (esto se establece dentro de onOptionsItemSelected para comprobar la presión de artículos de casa – no hace nada). Cuando presiono el botón de retroceso me lleva de nuevo al lugar correcto. Sin embargo, si vuelvo a navegar, la flecha hacia atrás mostrará más tiempo aunque el código onCreate por onCreate !

Ok, así que me las arreglé para resolver esto después de algún ensayo y error. Dos cambios realizados:

  1. Implementar addOnBackStackChangedListener
  2. ActionBarDrawerToggle's setToolbarNavigationClickListener necesitaba ser configurado

Como sólo tengo una actividad (todo lo demás es Fragment clases) He añadido el oyente onCreate método onCreate la actividad onCreate :

 getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } else { getSupportActionBar().setDisplayHomeAsUpEnabled(false); } } }); 

Esto resolvió la desaparición de la flecha hacia atrás al volver al fragmento. Por último agregó el oyente a la clase de instalación de mi NavigationDrawer:

 mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().onBackPressed(); } }); 

Supongo que las únicas preguntas que tengo es todo apuntó hacia el uso del método onOptionsItemSelected con android.R.id.home pero esto nunca funcionó para mí. Podría ser la forma en que he implementado las cosas, por supuesto, pero si alguien ve algo obvio en cuanto a por qué por favor hágamelo saber!

Estos pasos le ayudan a mostrar el botón Atrás en la barra de herramientas cuando se carga un fragmento. Y para salir cuando se hace clic.

Establecer setNavigationOnClickListener a la barra de herramientas en su actividad.

 final DrawerLayout 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(); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(getSupportFragmentManager().getBackStackEntryCount() > 0){ getSupportFragmentManager().popBackStack(); }else { drawer.openDrawer(GravityCompat.START); } } }); 

Implementar FragmentManager.OnBackStackChangedListener en su actividad. Y registrarlo con SupportFragmentManager en OnCreate()

  getSupportFragmentManager().addOnBackStackChangedListener(this); 

OnBackStackChangedListener Método de implementación:

 @Override public void onBackStackChanged() { if(getSupportFragmentManager().getBackStackEntryCount() > 0){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); }else { getSupportActionBar().setDisplayHomeAsUpEnabled(false); toggle.syncState(); } } 

Para mí la respuesta anterior no era suficiente, pero he utilizado @ Hamz4h_ y agregó un poco más después de excavar en la clase ActionBarDrawerToggle. Estoy llamando a este método de la mía de la actividad onCreate:

 private void initNavigationElements() { final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mBinding.drawerLayout, mBinding.appBarMain.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); mBinding.drawerLayout.addDrawerListener(toggle); // Tricking the toggle by giving it its own arrow as a custom indicator. // It will use it when setDrawerIndicatorEnabled is called with false toggle.setHomeAsUpIndicator(toggle.getDrawerArrowDrawable()); toggle.syncState(); getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { DrawerArrowDrawable drawerArrowDrawable = toggle.getDrawerArrowDrawable(); if (getSupportFragmentManager().getBackStackEntryCount() > 0) { // 1 - Display as arrow drawerArrowDrawable.setProgress(1); toggle.setDrawerIndicatorEnabled(false); } else { // 2 - Display as arrow menu drawerArrowDrawable.setProgress(0); toggle.setDrawerIndicatorEnabled(true); } } }); toggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // This is called only when setDrawerIndicatorEnabled is set as false, meaning we are not at the "root" fragment. getSupportFragmentManager().popBackStackImmediate(); } }); } 

Espero que esto ayude a alguien 🙂

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