Подтвердить что ты не робот

Android: Как включить/отключить пункт меню выбора при нажатии кнопки?

Я могу легко сделать это, когда я использую onCreateOptionsMenu или onOptionsItemSelected.

Но у меня есть кнопка где-то на экране, и при нажатии этой кнопки она должна включать/отключать пункты контекстного меню.

4b9b3361

Ответ 1

В любом случае документация охватывает все.

Изменение элементов меню во время выполнения

Как только действие будет создано, Вызов метода 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().

Ответ 2

Во всех версиях Android наиболее простой способ: использовать это, чтобы ПОКАЗАТЬ значок действия меню как отключенный И сделать его ФУНКЦИЕЙ также отключенным:

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

Ответ 3

Вы можете сохранить элемент как переменную при создании меню параметров, а затем изменить его свойства по своему усмотрению.

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

Ответ 4

упростить версию @Vikas

@Override
public boolean onPrepareOptionsMenu (Menu menu) {

    menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
    return true;
}

Ответ 5

лучшее решение когда вы выполняете на ящике навигации

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        menu.setGroupVisible(0,false);
        return true;
    }

Ответ 6

Как обновить текущее меню, чтобы включить или отключить элементы при выполнении 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

        }
    }

Результаты

enter image description here

Ответ 7

  @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {

                case R.id.item_id:

                       //Your Code....

                        item.setEnabled(false);
                        break;
              }
            return super.onOptionsItemSelected(item);
     }

Ответ 8

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

Ответ 9

Если видно меню

menu.findItem(R.id.id_name).setVisible(true);

Если скрыть меню

menu.findItem(R.id.id_name).setVisible(false);

Ответ 10

Более современный ответ на старый вопрос:

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>

Ответ 11

Как правило, можно изменять свойства ваших просмотров во время выполнения:

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

        }

Я надеюсь, что это поможет