0

让我给你一个简短的场景。

我想在我的操作栏上有一个刷新按钮,它在加载某些东西时切换到 indeterminateProgressStyle (一个旋转的圆圈)。

在我的项目中,我有以下布局。(例如 res/layout/actionbar_indeterminate_progress.xml)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center">
    <ProgressBar android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:layout_gravity="center"
        style="?android:attr/indeterminateProgressStyle" />
</FrameLayout>

当用户单击刷新按钮时,我执行以下操作。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);

    refreshMenuItem = menu.findItem(R.id.menu_refresh);

    if (refreshMenuItem != null) {
        // Show refresh button if we are in action bar mode, but only if
        // there's something to be refreshed
        boolean selectedItemExists = (getCurrentBrowsingContainer() != null);
        refreshMenuItem.setVisible(selectedItemExists);
        if (is_spinner_running) {
            refreshMenuItem.setActionView(R.layout.actionbar_indeterminate_progress);
        } else {
            refreshMenuItem.setActionView(null);
        }
    }

    return super.onCreateOptionsMenu(menu);
}

我的 res/menu/main.xml 也如下所示。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    ...
        <item android:id="@+id/menu_refresh" android:icon="@drawable/ic_menu_refresh" android:showAsAction="always" android:title="@string/refresh" />
    <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="never" />
    <item android:id="@+id/settings" android:title="@string/settings" android:icon="@android:drawable/ic_menu_preferences"></item>
    <item android:id="@+id/exit" android:title="@string/exit" android:icon="@android:drawable/ic_menu_close_clear_cancel"></item>   
        ...
</menu>

问题是,例如,我以纵向开始我的活动并点击刷新按钮,它很好地停止了。现在我旋转它并再次点击刷新按钮,但现在它出于某种原因继续显示不确定的进度。我检查了, refreshMenuItem.setActionView(null) 被调用,但它仍然继续显示不确定的东西。现在,由于某种原因,refreshMenuItem 似乎不可见,因为当我单击不确定的进度时,没有调用 onOptionsItemSelected。

所以我尝试了一个不同的示例应用程序,它可以完美运行,没有任何问题。所以我想知道我哪里出错了。任何指针都会有所帮助。

4

2 回答 2

1

其实我发现了问题。我的项目之前应该处理配置更改(所以我们在清单中有 configchanges)。使用 actionbarsherlock,它对 configchanges 变得无响应。

现在,由于我们之前没有在配置更改时重新创建活动,因此我们在一些代码中传递了活动,这很好,因为它从未重新创建并且我们负责清理它。但是现在要让 actionbarsherlock 工作,我们必须在 configchanges 上重新创建活动。活动的早期实例仍然存在于代码的某些部分,并且没有被活动的新实例覆盖。所以我试图停止旋转的菜单项实际上属于旧实例,而不是新实例。

所以重构了代码以使用活动的当前实例,一切都很好!

于 2012-07-19T12:37:53.033 回答
0

关于单击中间进度时未调用 onOptionsItemSelected:设置操作视图时,它会禁用操作项的默认行为。它还覆盖先前设置的操作提供者。处理动作视图点击的唯一方法是设置 OnClickListener。

关于轮换后不停止的中间进度:我没有确切的这个问题。在我的情况下,当我单击刷新操作项时,中间进度根本不会显示,但如果它是从代码触发的,它会很好地显示出来。我使它工作的方法是将调用 setActionView(...) 的代码移动到Handler.post(Runnable)

于 2012-07-14T09:21:56.087 回答