Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


OnNavigationItemSelected en ActionBar se está llamando en el inicio cómo puede evitarlo?

Estoy utilizando ActionBar con un menú desplegable, y onNavigationItemSelected() se llama tan pronto como se crea la actividad, por lo que se llama al primer elemento. El primer elemento de mi menú desplegable es Inicio, la misma acción que presionar el icono de la aplicación con android.R.id.home por lo que cuando la aplicación se inicia se llama a sí mismo. Para evitar que esto suceda tengo este código:

 if(this.getClass() != FrecView.class){ //if i am not currently on the Activity Intent frec = new Intent(this, FrecView.class); frec.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(frec); } 

Pero tengo ActionBar en todas mis actividades por lo que cada vez que se inicia cada actividad se llama a sí mismo para siempre por lo que tengo que poner ese código para cada actividad. ¿Que esta pasando? ¿Cómo puedo evitar que esto suceda?

  • Barra de Acción de Android Botón Arriba versus Sistema Botón Atrás
  • Android: Barra de acción personalizada, ¿Cómo usar todo el ancho?
  • Barra de acción de Android - quitar dinámicamente la barra de acción
  • Barra de acción dividida en Android 5.0 (Lollipop)
  • Android: cómo ocultar ActionBar en ciertas actividades
  • La superposición de la barra de acciones no funciona como se esperaba
  • Activar / desactivar dinámicamente ocultar / mostrar el icono de acción de Android ActionBar
  • Cómo cambiar el texto en la barra de acción
  • 4 Solutions collect form web for “OnNavigationItemSelected en ActionBar se está llamando en el inicio cómo puede evitarlo?”

    Estoy usando ActionBar con un menú desplegable y onNavigationItemSelected () se llama tan pronto se crea actividad

    Esto no está diseñado para ser un "menú", como tampoco las pestañas están diseñadas para ser un "menú". La navegación de lista está diseñada para permitir al usuario indicar algún contenido para la actividad actual , normalmente reemplazando un fragmento. Los elementos de acción (por ejemplo, los botones de la barra de herramientas, el área de despliegue de acción) son para navegar entre actividades.

    El primer elemento de mi menú desplegable es Inicio la misma acción que presionar el icono de aplicación con android.R.id.home por lo que cuando la aplicación se inicia se llama a sí mismo.

    Por lo tanto, eliminarlo de su "menú". El usuario puede presionar el icono de la aplicación a la izquierda para navegar por su casa.

    Como Mark ha dicho, no está diseñado para ser un menú.

    Sin embargo, aquí hay un enfoque rápido y sucio para ignorar la primera llamada:

    Declare este campo de clase:

     //mNaviFirstHit should be initialized to true private boolean mNaviFirstHit = true; 

    Y en el onNavigationItemSelected:

     @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { if (mNaviFirstHit) { mNaviFirstHit = false; return true; } // DO WHAT YOU WOULD NORMALLY DO } 

    Puede forzar la opción predeterminada correcta en su "menú" con lo siguiente:

     bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(indexOfCurrentActivityInTheMenu); 

    Contra-intuitivamente esto debe hacerse DESPUÉS de establecer las devoluciones de llamada (que a mi mente le daría la devolución de llamada la oportunidad de disparar con el índice de navegación de 0). Por ejemplo, mi aplicación tiene dos actividades ListView y PageView, y me gusta mi menú de navegación ordenado alfabéticamente, pero la actividad de inicio predeterminada es PageView. Así que tengo lo siguiente en onView de PageView ():

     bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(1); 

    Y en onCreate de ListView ():

     bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(0); 

    Entonces, no importa cuántas veces llamo startActivity (otherView), siempre establecerá el menú de navegación correctamente.

    En primer lugar, gracias a @CommonsWare por recordarnos que es una alternativa a las pestañas, por lo que el código debe ser diseñado con esa perspectiva. Aunque no es tan sencillo como parece, sin embargo, podemos trabajar por ahí.

    Esto se puede evitar usando una bandera también. Pero, de todos modos te sugiero el enfoque que tomé para arreglar esto.

    Sólo asegúrese de que se llame una vez. Además de eso lo convierten en una clase interior más que anónima. Esto evitará que se llame cada vez que se ejecuta esta parte del código. Código abajo:

     if(localOnNavigationListener != null) localOnNavigationListener = new LocalOnNavigationListener(); class LocalOnNavigationListener implements OnNavigationListener{ @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { // do something return true; } } 

    Y veo un evento extraño aquí, si lo hago una clase interna no llama onNavigationItemSelected (), si lo hacemos una clase anónima, disparará método onNavigationItemSelected. Si alguien puede arrojar alguna luz sobre esto, será útil.

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