Відповіді:
У всякому разі, документація охоплює всі речі.
Після створення активності
onCreateOptionsMenu()
метод викликається лише один раз, як описано вище. Система зберігає та повторно використовує визначеніMenu
вами в цьому методі, поки ваша діяльність не буде знищена. Якщо ви хочете змінити меню "Параметри" будь-коли після його створення, вам слід перекритиonPrepareOptionsMenu()
метод. Це передає вам об'єкт меню таким, який він існує. Це корисно, якщо ви хочете видалити, додати, відключити або включити пункти меню залежно від поточного стану вашої програми.
Напр
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}
На Android 3.0 і новіших версіях меню параметрів вважається завжди відкритим, коли пункти меню представлені на панелі дій. Коли відбувається подія і ви хочете виконати оновлення меню, вам потрібно зателефонувати, invalidateOptionsMenu()
щоб подати запит на системний виклик onPrepareOptionsMenu()
.
false
щоб повністю відключити меню.
Для всіх версій для Android найпростіший спосіб: скористайтеся цим, щоб ПОКАЗНАТИ значок дії меню як відключений І зробити його FUNCTION також відключеним:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.menu_my_item);
if (myItemShouldBeEnabled) {
item.setEnabled(true);
item.getIcon().setAlpha(255);
} else {
// disabled
item.setEnabled(false);
item.getIcon().setAlpha(130);
}
}
Ви можете зберегти елемент як змінну при створенні меню опцій, а потім змінити його властивості за бажанням.
private MenuItem securedConnection;
private MenuItem insecuredConnection;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.connect_menu, menu);
securedConnection = menu.getItem(0);
insecuredConnection = menu.getItem(1);
return true;
}
public void foo(){
securedConnection.setEnabled(true);
}
onPrepareOptionsMenu
?
спростити версію @Vikas
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
Як оновити поточне меню, щоб увімкнути або вимкнути елементи, коли виконано AsyncTask.
У моєму випадку використання мені потрібно було вимкнути меню, коли мій AsyncTask завантажував дані, після завантаження всіх даних мені потрібно було знову включити все меню, щоб користувач міг ним користуватися.
Це заважало додатку дозволяти користувачам натискати на пункти меню під час завантаження даних.
По-перше, я оголошу змінну стану, якщо змінна 0, відображається меню, якщо ця змінна - 1, меню приховано.
private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.
Тоді в моєму onCreateOptionsMenu()
я перевіряю цю змінну, якщо це 1, я відключаю всі свої елементи, якщо ні, я просто показую їх усі
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);
if(mMenuState==1){
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}else{
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(true);
}
}
return super.onCreateOptionsMenu(menu);
}
Тепер, коли починається "Моя активність", onCreateOptionsMenu()
буде називатися лише один раз, і всі мої елементи будуть втрачені, тому що я створив стан для них на початку.
Тоді я створюю AsyncTask Де я встановив цю змінну стану на 0 у своєму onPostExecute()
Цей крок дуже важливий!
Коли ви invalidateOptionsMenu();
його зателефонуєте, він відновитьсяonCreateOptionsMenu();
Отже, встановивши свій стан на 0, я просто переробив все меню, але цього разу зі своєю змінною на 0, яка сказала, все меню буде показано після того, як буде виконано весь асинхронний процес, і тоді мій користувач може використовувати меню .
public class LoadMyGroups extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration.
}
@Override
protected Void doInBackground(Void... voids) {
//Background work
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu
}
}
найкраще рішення, коли ви працюєте на навігаційному ящику
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(0,false);
return true;
}
Більш сучасна відповідь на старе питання:
MainActivity.kt
private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
if (new != old) invalidateOptionsMenu()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main_activity, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
return super.onPrepareOptionsMenu(menu)
}
menu_main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_my_action"
android:icon="@drawable/ic_my_icon_24dp"
app:iconTint="@drawable/menu_item_icon_selector"
android:title="My title"
app:showAsAction="always" />
</menu>
menu_item_icon_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?enabledMenuIconColor" android:state_enabled="true" />
<item android:color="?disabledMenuIconColor" />
attrs.xml
<resources>
<attr name="enabledMenuIconColor" format="reference|color"/>
<attr name="disabledMenuIconColor" format="reference|color"/>
</resources>
styles.xml or themes.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="disabledMenuIconColor">@color/white_30_alpha</item>
<item name="enabledMenuIconColor">@android:color/white</item>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_id:
//Your Code....
item.setEnabled(false);
break;
}
return super.onOptionsItemSelected(item);
}
Що я зробив, це зберегти посилання на Меню на onCreateOptionsMenu
. Це схоже на відповідь nir, за винятком того, що замість того, щоб зберегти кожен окремий пункт, я зберегла все меню.
Оголосити меню Menu toolbarMenu;
.
Потім onCreateOptionsMenu
збережіть меню до змінної
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
toolbarMenu = menu;
return true;
}
Тепер ви можете отримати доступ до свого меню та всіх його пунктів у будь-який час.
toolbarMenu.getItem(0).setEnabled(false);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.home, menu);
return false;
}
Якщо видиме меню
menu.findItem(R.id.id_name).setVisible(true);
Якщо сховати меню
menu.findItem(R.id.id_name).setVisible(false);
Зазвичай можна змінити властивості ваших поглядів під час виконання:
(Button) item = (Button) findViewById(R.id.idBut);
і потім...
item.setVisibility(false)
але
якщо ви хочете змінити видимість параметрів із ContextMenu, натиснувши кнопку, ви можете активувати прапор, а потім у onCreateContextMenu ви можете зробити щось подібне:
@Override
public void onCreateContextMenu(ContextMenu menu,
View v,ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(R.string.context_title);
if (flagIsOn()) {
addMenuItem(menu, "Option available", true);
} else {
Toast.makeText(this, "Option not available", 500).show();
}
}
Я сподіваюся, що це допомагає
onCreateContextMenu
методі. Але я хочу отримати доступ до контекстного меню стороною від цього методу.
onCreateContextMenu
буде викликано лише один раз, але я можу натискати кнопку багато часу, щоб увімкнути / вимкнути пункт меню.
setEnable()
чи змінюється те, що відбувається при натисканні цього меню, але не змінюється, як воно виглядає (що не так, розробники Android?). Тому чіткіше або відключити і змінити заголовок, або бажано просто зробитиMenuItem
невидимим.