studio onoptionsitemselected from android-fragments android-optionsmenu

android-fragments - onoptionsitemselected - oncreateoptionsmenu fragment



onCreateOptionsMenu() llamado dos veces en Fragment (5)

Tengo una aplicación simple con menú de opciones, que cambia al comienzo de los fragmentos. El problema es que al principio cualquier fragmento excepto el primero onCreateOptionsMenu () lo llamó dos veces: dentro deCreate () y después de onResume (). En onCreate () lo llamo manual a través de setHasOptionsMenu (verdadero), pero después de onResume () no debería suceder. Además, esto solo ocurre después de que comenzó el primer fragmento.

Aquí está el código de fragmentos base:

class BaseFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle clicks return true; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Create a menu super.onCreateOptionsMenu(menu, inflater); } }

Y el código cambiante de fragmentos en la Actividad:

public void startFragment(BaseFragment fragment) { getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, fragment) .commit(); }

El ejemplo no usa ninguna biblioteca externa como ActionBarSherlock, solo SupportLibrary. Supongo que el problema está en el método FragmentTransaction replace (), porque funciona bien cuando se inicia el primer fragmento. Pero no sé, dónde comenzar a resolver el problema. Necesito reemplazar el fragmento en View.


Si no maneja el elemento de menú, debe llamar a la implementación de superclase de onOptionsItemSelected () (la implementación predeterminada devuelve falso).

@Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); }


Tal vez podrías intentarlo así:

private final int MENU_SEARCH=Menu.FIRST; : @Override public void onPrepareOptionsMenu(Menu menu) { if (menu.findItem(MENU_SEARCH)==null) { menu.add(0, MENU_SEARCH, Menu.NONE, getText(R.string.menu_search)); :

Es decir, compruebe si uno de los elementos del menú existe en el menú, y si no, probablemente todos ellos deben agregarse.


Sé que llego tarde a la fiesta, pero me encontré con el mismo problema, y ​​mi solución fue agregar explícitamente

setHasOptionsMenu(false);

a mi función SupportFragments onCreate. Esto evita cualquier llamada extra a las actividades ''onCreateOptionsMenu y onPrepareOptionsMenu. Espero que esto ayude.


La forma más fácil de resolver el problema es borrar el menú justo antes de que esté inflado.

menu.clear () borrará cualquier menú existente, y comenzará con uno nuevo.

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); inflater.inflate(R.menu.sample_menu, menu); }


¡Supongo que el fragmento recién añadido hace que las actividades en CreateOptionsMenu vuelvan a llamarse!

1> Prueba a agregar

setRetainInstance (verdadero);

para fragmentar constructor!

public BaseFragment() { setRetainInstance(true); setHasOptionsMenu(true); }

Esto salvará / restaurará los estados individuales de cada uno de los fragmentos al girar

El problema parece estar relacionado con el hecho de que Android no destruye el fragmento cuando se destruye la actividad (cuando se gira el dispositivo).

Encontré esto aquí Jake Wharton en SO

Actualización: 2> Otra forma es evitar agregar los fragmentos en el archivo de diseño y también instanciarlos manualmente llamando al método constructor / newInstance.

Si agrega un fragmento en el diseño, el marco de Android creará una instancia para usted. En lugar de crear instancias de los fragmentos manualmente, debe recuperar su instancia llamando a FragmentManager.getFragmentById y usar esa instancia en su lugar.

Por lo tanto, siempre incluya una identificación y / o una etiqueta para sus fragmentos

3> Pruebe con esto llamando a menu.clear ()

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.call_menu, menu); super.onCreateOptionsMenu(menu, inflater); }