在操作栏中更改菜单项的视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在操作栏中更改菜单项的视图相关的知识,希望对你有一定的参考价值。

我正在尝试在我的应用中实现刷新按钮,以允许用户手动重新同步到Web服务器。代码有效,但我无法弄清楚动作视图(至少,我认为这是我应该使用的)。

我的菜单项目在这里:

<item
    android:id="@+id/main_menu_refresh"
    android:enabled="true"
    android:icon="@drawable/refresh"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:title="@string/refresh" 
    android:actionViewClass="android.widget.ProgressBar">
</item>

问题是,它总是显示ProgressBar。我想知道它是否像搜索小部件(我真正在网上看到的唯一例子)一样工作,并将collapseActionView标签添加到showAsAction并且阻止它立即显示。但是,当我单击刷新按钮时,图标会消失(好),但操作栏中的标题也会消失,并且ProgressBar会出现在标题所在的窗口左侧。也不是我想要的。

作为最后的努力,我试图将其添加到我的代码中,并从XML中删除actionViewClass

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
Log.w("MyApp", "Have Menu");
ProgressBar pb = new ProgressBar(ReadingList.this);
refresh.setActionView(pb);

这也没用,给我一个setActionView上的空指针错误。

我需要一个可以从任何函数调用的解决方案(开始时我有一个自动同步周期,我希望ProgressBar也可以显示),然后能够将它返回到它的静态图标。

我尝试通过this question阅读,但我无法理解答案的含义。我觉得我试图按照它说的做,但我想不是。非常感谢任何帮助。

编辑:对于sastraxi的建议。

public class IconSwitcher extends LinearLayout{



public IconSwitcher(Context context) {
    super(context);

    ProgressBar pb = new ProgressBar(context);
    ImageView iv = new ImageView(context);

    addView(iv);
    addView(pb);
}
}

到目前为止,这是我的班级。但是,当我尝试引用它时:

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
IconSwitcher ic = (IconSwitcher) refresh.getActionView();

我得到一个空指针错误。创建IconSwitcher。按钮XML如下:

<item
    android:id="@+id/main_menu_refresh"
    android:enabled="true"
    android:icon="@drawable/refresh"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:title="@string/refresh" 
    android:actionViewClass="IconSwitcher">
</item>

我只是在参考IconSwitcher View时遇到了困难。

编辑2:我看起来很难引用菜单项。

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
refresh.setVisible(false);

当我尝试设置可见性时,还给我一个空指针。我的推荐有什么问题?

答案

不要将动作视图类设置为ProgressBar,而是将其设置为自定义LinearLayout类,如下所示:

class MyViewItem extends LinearLayout

ProgressBar的构造函数中添加ImageViewaddView作为子项,并在代码需要时将这些孩子的可见性设置为GONEVISIBLE

另一答案

尝试使用:

<item
    android:id="@+id/main_menu_refresh"
    android:enabled="true"
    android:icon="@drawable/refresh"
    android:orderInCategory="1"
    android:title="@string/refresh"
    app:showAsAction="ifRoom"
    app:actionViewClass="android.widget.ProgressBar">
</item>

注意这两行:

    app:showAsAction="ifRoom"
    app:actionViewClass="android.widget.ProgressBar"
另一答案

您是否尝试过这样的菜单项?

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST);

以上是关于在操作栏中更改菜单项的视图的主要内容,如果未能解决你的问题,请参考以下文章

每个底部导航视图菜单项的单独导航图 - Android

仅在父片段中的操作栏中显示搜索视图

如何更改操作栏中的选项菜单图标?

在android操作栏中的菜单项之间显示分隔符

如何在操作栏中隐藏菜单项?

如何更改操作栏中下拉菜单的背景颜色