traduccion studio programacion icono boton barra bar agregar acciones android menu android-fragments android-actionbar

android - studio - barra de acciones word



¿Cómo actualizar un elemento de menú que se muestra en la barra de acciones? (6)

He usado este código:

public boolean onPrepareOptionsMenu (Menu menu) { MenuInflater inflater = getMenuInflater(); TextView title = (TextView) findViewById(R.id.title); menu.getItem(0).setTitle( getString(R.string.payFor) + " " + title.getText().toString()); menu.getItem(1).setTitle(getString(R.string.payFor) + "..."); return true; }

Y funcionó como un encanto para mí, puedes encontrar OnPrepareOptionsMenu here

Tengo una actividad que tiene 2 fragmentos. Ambos son ListFragments y ambos aportan MenuItems al Menú. Tengo un MenuItem que he configurado el atributo android: showAsAction para que se muestre como un botón en la barra de acciones. Lo cual funciona bien.

Ahora el MenuItem depende del estado. Es una opción de menú Pausa / Reanudar para pausar y reanudar una cola. Mi problema es que no puedo entender cómo configurar su estatua inicial cuando se crea el Fragmento.

Su estado depende de si la cola está pausada o no. Así que tengo una AsyncTask que obtiene la cola y establece un valor booleano (pausa) en función del estado de la cola. Llamaré aPrepareOptionsMenu para configurar el texto para el elemento del menú Pausa en función del último estado conocido de la cola y esto funciona muy bien si dejo el elemento del menú en el menú actual. Toca el ícono del menú y onPrepareOptionsMenu se activa y el menú se actualiza antes de que se muestre.

El problema es que si pongo el mismo MenuItem en ActionBar (showAsAction), ¿cómo puedo forzarlo a actualizar sin tener que llamar a onPrepareOptionsMenu? Necesito poder hacer esto porque en el primer lanzamiento de la aplicación, envío una solicitud para obtener la cola, pero la tarea vuelve luego de que se configuró y se muestra la barra de acciones. Creé un controlador en mi fragmento al que se llama cada vez que obtengo una actualización de la cola, pero a partir de ahí, ¿cómo puedo actualizar el texto de mi MenuItem en la barra de acciones? Parece que no puedo encontrar la manera de hacer que el Menú configurado actualmente lo manipule excepto en onPrepareOptionMenu.

Rob W.


Para actualizar el menú desde Fragment, simplemente llame a:

getActivity().invalidateOptionsMenu();


Para mayor claridad, pensé que a partir de lo siguiente puedo mostrar un ejemplo directo de cómo agarrarme a un recurso que creo que contribuye a la respuesta a esta pregunta con un rápido ejemplo directo.

private MenuItem menuItem_; @Override public boolean onCreateOptionsMenu(Menu menuF) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_layout, menuF); menuItem_ = menuF.findItem(R.id.menu_item_identifier); return true; }

En este caso, usted se aferra a una referencia de MenuItem al principio y luego cambia el estado (por ejemplo, para los cambios de estado de ícono) en un punto dado en el tiempo.


Primero, siga las dos líneas de códigos para actualizar los elementos de la barra de acciones antes de que deba establecer una condición en oncreateOptionMenu (). Por ejemplo:

Boolean mISQuizItemSelected = false; /** * Called to inflate the action bar menus * * @param menu * the menu * * @return true, if successful */ @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar inflater.inflate(R.menu.menu_demo, menu); //condition to hide the menus if (mISQuizItemSelected) { for (int i = 0; i < menu.size(); i++) { menu.getItem(i).setVisible(false); } } return super.onCreateOptionsMenu(menu); } /** * Called when the item on the action bar being selected. * * @param item * menuitem being selected * * @return true if the menuitem id being selected is matched * false if none of the menuitems id are matched */ @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getId() == R.id.action_quiz) { //to navigate based on the usertype either learner or leo mISQuizItemSelected = true; ActionBar actionBar = getActionBar(); invalidateOptionMenu(); } }


en mi caso: invalidateOptionsMenu acaba de volver a configurar el texto al original, pero el acceso directo al elemento del menú y volver a escribir el texto de deseo funcionó sin problemas:

if (mnuTopMenuActionBar_ != null) { MenuItem mnuPageIndex = mnuTopMenuActionBar_ .findItem(R.id.menu_magazin_pageOfPage_text); if (mnuPageIndex != null) { if (getScreenOrientation() == 1) { mnuPageIndex.setTitle((i + 1) + " von " + pages); } else { mnuPageIndex.setTitle( (i + 1) + " + " + (i + 2) + " " + " von " + pages); } // invalidateOptionsMenu(); } }

debido al comentario a continuación, pude acceder al elemento del menú a través del siguiente código:

@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.magazine_swipe_activity, menu); mnuTopMenuActionBar_ = menu; return true; }


Opción n. ° 1: prueba invalidateOptionsMenu() . No sé si esto forzará un redibujado inmediato de la barra de acción o no.

Opción n. ° 2: vea si getActionView() devuelve algo para el elemento de MenuItem afectado. Es posible que showAsAction simplemente cree automáticamente vistas de acción para usted. Si es así, presumiblemente puede habilitar / deshabilitar esa View .

Parece que no puedo encontrar la manera de hacer que el Menú configurado actualmente lo manipule excepto en onPrepareOptionMenu.

Puedes colgar en el objeto de Menu que te entregaron en onCreateOptionsMenu() . Citando los docs :

Puede mantener de forma segura el menú (y cualquier elemento creado a partir de él), realizando modificaciones según lo desee, hasta que se llame a la próxima vez en Crear oracionesMenú ().