Как я могу динамически создавать пункты меню?
Я создаю приложение для Android, и я пытаюсь построить систему управления пользователями, где пользователи могут войти, выйти из системы и т. д. Я хочу отобразить пункт меню входа в систему, если пользователь вышел из системы, и кнопку выхода из системы, если пользователь вошел в систему. Как я могу сделать это динамически?
это файл макета прямо сейчас:
<?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));
}
4 ответов:
как динамически добавлять пункты меню В Android Activity
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 (i.e. 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; }
в следующем конкретном примере добавляется параметр 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 () (Примечание: необходимо использовать библиотеку совместимости , как actionBarSherlock для доступа в случае, если вам нужно поддерживать низкие версии API), а затем обновить пункты меню в соответствии со статусом.
там вы можете скрыть элемент действия входа в систему и показать элемент действия выхода из системы.
вы также можете попробовать обновить сам значок, но я никогда не пробовал.
в моем случае пункты меню находятся в ArrayList,- попробуйте это надеюсь, что это поможет u :)
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(); }
простой способ создания пунктов меню :
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(); } });попробуйте это :)
Comments