屏幕旋转后更新菜单项

时间:2013-11-04 14:18:05

标签: android android-asynctask menuitem screen-rotation

当用户单击操作栏中的菜单项并启动执行某些操作的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);
            }
        }
    }
}

重新创建活动时(例如,旋转屏幕时)会出现问题,因为未显示进度条且MyTask中的menuItem引用变为无效。所以问题是: 1)创建菜单(onCreateOptionsMenu方法)时,如何知道是否单击了menuItem? 2)在onPostExecute中,如何检索对MenuItem对象的有效引用?

1 个答案:

答案 0 :(得分:0)

了解以下方法的使用

onCreateOptionsMenu
onPrepareOptionsMenu
onOptionsItemSelected
invalidateOptionsMenu

现在,当您单击某个项目时,从onOptionsItemSelected中保存对所单击项目的引用。接下来启动AsyncTask并显示ProgressBar。完成任务后,要更新菜单项,请从AsyncTask的onPostExceute调用invalidateOptionsMenu。

您可以在屏幕配置更改等之前使用onSaveInstanceState()保存menuItem的状态(可见/不可见),然后从savedInstanceBundle重新创建。

您必须具有在onPrepareOptionsMenu中显示/隐藏菜单项的逻辑。每当您想要更新菜单项时,请调用invalidateOptionsMenu。

希望它能为你指明方向。