我如何dynamic创build菜单项?

我正在构build一个Android应用程序,我试图build立一个用户pipe理系统,用户可以login,注销等。我想要显示一个login菜单项,如果用户注销loginbutton,如果用户login我怎样才能dynamic地做到这一点?

这是现在的布局文件:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add" android:title="Add" android:icon="@drawable/ic_menu_add"/> <item android:id="@+id/list" android:title="List" android:icon="@drawable/ic_menu_list"/> <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_menu_refresh"/> <item android:id="@+id/login" android:title="Login" android:icon="@drawable/ic_menu_login"/> </menu> 

这是我的Java现在:

 @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)); } 

如何dynamic添加菜单项到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; } 

如果用户login,以下具体示例将添加一个MENU_LOGOUT选项。

  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; ... } 

这就是它的全部。

你可以调用invalidateOptionsMenu ()(注意:如果需要支持低API版本的话,需要使用兼容性库,比如actionBarSherlock来访问),然后根据状态更新菜单项。

在那里你可以隐藏login行动项目,并显示注销行动项目。

你也可以尝试更新图标本身,但我从来没有尝试过。

在我的情况下菜单项是在ArrayList, 试试这个希望它会帮助你:)

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