Обновить пункт меню после поворота экрана
Я хотел бы показать индикатор выполнения, когда пользователь щелкает пункт меню на панели действий и запускает 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.
Надеюсь, это даст вам направление.