Обновить пункт меню после поворота экрана

Я хотел бы показать индикатор выполнения, когда пользователь щелкает пункт меню на панели действий и запускает AsyncTask, который выполняет некоторую работу. Когда закончите задачу, восстановите меню. Вот мой код:

public class DevicesActivity extends FragmentActivity {
...

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    switch (item.getItemId()) {
            case R.id.my_menu_action:
                MyTask task = new MyTask();
                task.execute(item);
                // Show a progress bar instead of default actionview
                item.setActionView(R.layout.progress_circle);
                item.expandActionView();
                return true;
         }
        return super.onOptionsItemSelected(item);
     }

    ...

    private class MyTask extends AsyncTask<MenuItem, Object, Object> {
        MenuItem menuItem;

        protected Object doInBackground(MenuItem... items) {
            item = items[0];

            try {
                Thread.sleep(2000);
            }
            catch (Exception e) {}

            return null;
        }

        protected void onPostExecute(Object result) {
            // Restore default action view
            if (menuItem != null) {
                menuItem.collapseActionView();
                menuItem.setActionView(null);
            }
        }
    }
}

Проблема возникает, когда действие воссоздается (например, при повороте экрана), поскольку индикатор выполнения не отображается, а ссылка на menuItem внутри MyTask становится недействительной. Итак, вопросы: 1) При создании меню (метод onCreateOptionsMenu), как я могу узнать, был ли нажат элемент меню? 2) В onPostExecute, как я могу получить действительную ссылку на объект MenuItem?

1 ответ

Читайте об использовании следующих методов

onCreateOptionsMenu
onPrepareOptionsMenu
onOptionsItemSelected
invalidateOptionsMenu

Теперь, когда вы нажимаете на элемент, из onOptionsItemSelected сохраните ссылку на элемент, на который щелкнули. Затем запустите AsyncTask и покажите ProgressBar. Когда закончите с задачей, для обновления пунктов меню вызовите invalidateOptionsMenu из onPostExceute вашей AsyncTask.

Вы можете сохранить состояние (видимое / невидимое) menuItem, используя onSaveInstanceState() перед изменением конфигурации экрана и т. д. и заново создайте из savedInstanceBundle,

Вы должны иметь логику, чтобы показать / скрыть пункты меню в onPrepareOptionsMenu. Всякий раз, когда вы хотите обновить свои пункты меню, вызывайте invalidateOptionsMenu.

Надеюсь, это даст вам направление.

Другие вопросы по тегам