操作栏进度指示器和刷新按钮

24

是否可以在刷新按钮的位置显示进度指示器(使用requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)显示的那个)?

想法是像Gmail客户端一样工作:当不加载时显示刷新按钮,当加载时在刷新按钮的位置显示不确定的旋转指示器。

2个回答

53

是的,你可以这样轻松地做到。

private MenuItem refresh;
.
.
.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.options_menu, menu);

    // refresh menu item
    refresh = menu.findItem(R.id.refresh_option_item);

    return super.onCreateOptionsMenu(menu);
}

您需要按照上面的方法获取刷新菜单项,然后可以像下面这样启用旋转项:

refresh.setActionView(R.layout.actionbar_indeterminate_progress);

当任务完成后,您可以像下面这样禁用旋转:

refresh.setActionView(null);

最后,actionbar_indeterminate_progress.xml 可以像这样:

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

1
问题在于有时候该引用为null,会导致npe错误。不知道如何重现,但我遇到了这个问题。我使用了你相同的方法... - gwvatieri
5
最好使用refresh.collapseActionView()和expandActionView()方法,并且只设置一次操作视图。 - Bostone
2
我遇到了这个问题:?android:attr/indeterminateProgressStyle 需要API 11及以上版本。有没有办法让这个解决方案在API 10上工作? - Adam
3
我的问题是(我使用的是Galaxy Nexus),当它切换状态时,会从左到右稍微移动一下。有人遇到过这个问题吗? - viplezer
2
针对API 11以下的版本,请使用MenuItemCompat.setActionView()方法。 - TheIT
显示剩余6条评论

0
你可以尝试以下方法:将刷新按钮和不定进度圈都放在一个FrameLayout里,这样两个元素就可以在屏幕上的同一位置重叠显示。然后你只需要控制它们的可见性。当你想要显示刷新按钮时,将进度圈设置为不可见并将按钮设置为可见。当你想要显示进度圈时,将其设置为可见并将按钮设置为不可见。

我知道如何手动布局,但我想在操作栏中实现这一点。 - lujop
2
我的回答对你没有用吗?你甚至没有评论它。 :) - tasomaniac
能否使用广播意图进行交换? - Maxrunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接