ActionbarSherlock menuitem setActionView(null)不会停止旋转

时间:2012-07-11 19:46:18

标签: android android-actionbar actionbarsherlock

让我简要介绍一下正在发生的事情。

我想在我的操作栏上有一个刷新按钮,当某些东西正在加载时,它会切换到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没有被调用。

所以我尝试使用不同的样本app,它完美无缺。所以我想知道我哪里出错了。任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

关于在单击中间进度时未调用onOptionsItemSelected:设置操作视图时,它会禁用操作项的默认行为。它也会覆盖previously set action provider。处理动作视图单击的唯一方法是设置OnClickListener。

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