用一个不确定的ProgressBar替换ActionBar菜单项图标

18
我想在Honeycomb ActionBar中添加一个不确定进度条,以便每当用户按下“刷新”按钮时,刷新图标会暂时变成不确定进度条,直到任务完成。电子邮件应用程序已经实现了这一点,但我无法弄清楚如何做到这一点。
有什么建议吗?

与刷新/刷新相关:https://dev59.com/MWkw5IYBdhLWcg3wqMY1 - rds
6个回答

19
为了澄清Jon O的回答,关键是在刷新操作上设置和取消一个动作视图。这适用于ActionBarSherlock和原生4.x操作栏。以下代码片段将把进度不确定视图放在刷新图标的顶部,假设刷新菜单项具有ID“refresh_option”,替换布局(其中包含一个ProgressBar)位于布局“progress_wheel”中:
 MenuItem item = abmenu.findItem(R.id.refresh_option);
 LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 View abprogress = inflater.inflate(R.layout.progress_wheel, null);
 item.setActionView(abprogress);

取消进度视图,刷新图标将恢复可见:

 item.setActionView(null);

在 GitHub 上查看更详细的示例


问题是:新的进度条比常规操作项略宽。因此,当它出现时,所有相邻的项目都会稍微向两侧移动(并在其消失时“弹回”)。有什么解决方法吗? - Alex Semeniuk
还有其他人在AndroidX中看到我看到的情况吗?setActionView()(无论是View还是布局)只会使ActionBar菜单项消失吗? - RobP

5

为了简化larham1的答案:你甚至不需要膨胀新的操作视图本身,因为MenuItem该方法可以接受操作布局的id,所以你可以简单地写:

item.setActionView(R.layout.progress_bar);

5
很难准确地说电子邮件应用程序是如何实现的,但您可能希望保持简单,只需使用StateDrawable XML文件的ID调用setIcon,然后使用定时器更改状态。

2
设置图标仅适用于选项卡图标,而非操作栏本身。这是否也适用于操作栏图标,或者这个答案是错误的? - Janusz

4
你可以通过以下方法轻松实现:
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh: 
                item.setActionView(new ProgressBar(this));
                break;
        }
        return super.onOptionsItemSelected(item);

问题是:新的 ProgressBar 比普通的操作项略宽。因此,当它出现时,所有相邻的项都会稍微移动到两侧(并在消失时“弹回”)。有什么解决方法吗? - Alex Semeniuk
1
我创建了一个布局文件,其中包含以下代码:<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/progressBar2" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" android:layout_gravity="center" />。这可以避免菜单项的移动。请记得设置item.setActionView(R.layout.your_layout); - Devendra Vaja

4

事实证明,作为其广泛的ActionBarCompat兼容性项目的一部分,Google已经发布了一个做到这一点的示例。请查看


该示例依赖于具有相邻刷新图标和不定进度的设定布局,采用show/hide。在ActionBar中,我们没有该布局或访问权限。接下来尝试Femi的想法... - larham1
它确实在旧设备上使用show/hide功能,但是如果您查看ActionBarHelperHoneycomb / ActionBarHelperICS类,它们也会以正确/更新的方式在ICS和Honeycomb上执行此操作。 它适用于所有设备(我知道;我在我的应用程序中利用它来支持2.1 +、3.x和4.x,并且它在所有设备上都能正常运行,包括不确定进度条)。 - Jon O
链接现在已经失效了(Google决定删除URL?唉) - Adam
不幸的是,但我认为您仍然可以从Android支持库的SDK示例中获取代码。或者搜索“actionbarcompat”,并查看其中一个包含它的许多GitHub存储库(我不愿意链接任何一个特定的存储库)。 - Jon O
你如何使用广播意图将菜单项按钮/图标替换为不确定的进度条?我尝试过了但始终失败。 - Maxrunner

3

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