¿Cómo puedo crear dinámicamente elementos de menú?

Estoy construyendo una aplicación de Android y estoy tratando de construir un sistema de administración de usuarios donde los usuarios puedan iniciar sesión, cerrar sesión, etc. Quiero mostrar un elemento de menú de inicio de sesión si el usuario está desconectado y un botón de cerrar sesión si el usuario está conectado pulg. ¿Cómo puedo hacer esto de forma dinámica?

Este es el archivo de diseño en este momento:

       

Esta es mi Java ahora mismo:

 @Override public boolean onCreateOptionsMenu(Menu menu) { new MenuInflater(this).inflate(R.menu.activity_main, menu); return(super.onCreateOptionsMenu(menu)); } @Override public boolean onOptionsItemSelected(MenuItem item) { System.out.println(item.getItemId()==R.id.add); if (item.getItemId()==R.id.add) { //Cannot add spot unless we have obtained the users current location. if((currentLat != 0) && (currentLng != 0)) { System.out.println("loggedin? : " + auth.isLoggedIn()); if(!auth.isLoggedIn()) { Toast.makeText(MainActivity.this, "You must be logged in to add a new spot", Toast.LENGTH_LONG).show(); } else { Intent addIntent = new Intent(MainActivity.this, AddSpot.class); Bundle b = new Bundle(); b.putDouble("currentLat", currentLat); b.putDouble("currentLng", currentLng); addIntent.putExtras(b); startActivity(addIntent); return(true); } } } else if(item.getItemId()==R.id.list) { //Pointless showing them a blank screen if nothing is retrieved from the server if(list != null) { Intent listIntent = new Intent(MainActivity.this, ListLocations.class); listIntent.putExtra("list", list); startActivity(listIntent); return(true); } } if(item.getItemId()==R.id.refresh) { finish(); startActivity(getIntent()); return(true); } if(item.getItemId()==R.id.login) { Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class); startActivity(loginIntent); return(true); } return(super.onOptionsItemSelected(item)); } 

Cómo agregar dinámicamente elementos de menú a una actividad de Android

 public class yourActivity extends Activity { ... private static final int MENU_ADD = Menu.FIRST; private static final int MENU_LIST = MENU.FIRST + 1; private static final int MENU_REFRESH = MENU.FIRST + 2; private static final int MENU_LOGIN = MENU.FIRST + 3; /** * Use if your menu is static (ie unchanging) */ /* @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon); menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon); menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon); menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon); return true; } */ /** * Gets called every time the user presses the menu button. * Use if your menu is dynamic. */ @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); if(enableAdd) menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon); if(enableList) menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon); if(enableRefresh) menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon); if(enableLogin) menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case MENU_ADD: doAddStuff(); break; case MENU_LIST: doListStuff(); break; case MENU_REFRESH: doRefreshStuff(); break; case MENU_LOGIN: doLoginStuff(); break; } return false; } 

El siguiente ejemplo específico agrega una opción MENU_LOGOUT si el usuario está conectado.

  private static final int MENU_LOGOUT = MENU.FIRST + 4; public boolean onPrepareOptionsMenu(Menu menu) { ... if(auth.isLoggedIn()) { menu.add(0, MENU_LOGOUT, Menu.NONE, R.string.your-logout-text).setIcon(R.drawable.your-logout-icon); } ... } public boolean onOptionsItemSelected(MenuItem item) { ... case MENU_LOGOUT: if(auth.isLoggedIn()) { doLogout(); } else { Toast.makeText(this, "You must have somehow been logged out between the time the menu button was pressed and now.", Toast.DURATION_LONG).show(); } break; ... } 

Eso es todo al respecto.

puede llamar a invalidateOptionsMenu () (nota: necesita usar una biblioteca de compatibilidad como actionBarSherlock para acceder en caso de que necesite admitir versiones con poca API), y luego actualice los elementos del menú según el estado.

allí podría ocultar el elemento de acción de inicio de sesión y mostrar el elemento de acción de cierre de sesión.

También puedes probar actualizar el ícono pero nunca lo intenté.

En mi caso, los elementos del menú están en ArrayList, intenta esto Espero que te ayude 🙂

 public void onClick(View v) { PopupMenu menu = new PopupMenu(DialogCheckBox.this, v); for (String s : limits) { // "limits" its an arraylist menu.getMenu().add(s); } menu.show(); } 

Manera simple de crear elementos de menú:

 Dynamic_PopUpMenu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu menu = new PopupMenu(DialogCheckBox.this, v); menu.getMenu().add("AGIL"); // menus items menu.getMenu().add("AGILANBU"); // menus items menu.getMenu().add("AGILarasan"); menu.getMenu().add("Arasan"); menu.show(); } }); 

Prueba esto 🙂