【问题标题】:Update menu item after screen rotation屏幕旋转后更新菜单项
【发布时间】:2013-11-04 14:18:04
【问题描述】:

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

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

【问题讨论】:

    标签: android android-asynctask menuitem screen-rotation


    【解决方案1】:

    了解以下方法的使用

    onCreateOptionsMenu
    onPrepareOptionsMenu
    onOptionsItemSelected
    invalidateOptionsMenu
    

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

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

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

    希望能给你一个方向。

    【讨论】:

    • 如何简单地将 MenuItem 引用保存在 onSaveInstanceState 包中?我尝试将其转换为可序列化的,但这不起作用。
    • 我错了,我应该说“保存菜单项的状态”而不是对菜单项的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多