【问题标题】:Changing view on Menu Item in Action Bar更改操作栏中菜单项的视图
【发布时间】:2012-04-13 17:16:10
【问题描述】:

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

我的菜单项在这里:

<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 并阻止它立即显示。但是,当我单击刷新按钮时,图标会消失(很好),但操作栏中的 Title 也会消失,并且 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 视图时遇到了困难。

编辑 2:我似乎根本无法引用菜单项。

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

当我尝试设置可见性时,还会给我一个空指针。我的参考文献有什么问题?

【问题讨论】:

  • 我想通了。我发现了这个以前的SO 问题。从那里,我找到了谷歌写的代码here。那时基本上是复制和粘贴,而且效果很好。
  • 这不是在 setActionView 失败,而是在你正在执行 (MenuItem)findViewById(R.id.main_menu_refresh) 的地方失败。将 ActionItemView 转换为 MenuItem 显然是 ClassCastException。

标签: android android-actionbar actionview


【解决方案1】:

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

class MyViewItem extends LinearLayout

使用addView 在其构造函数中添加ProgressBarImageView 作为子级,并在您的代码需要时将这些子级的可见性设置为GONEVISIBLE

【讨论】:

  • 我无法理解。你能告诉我更多关于这个自定义类的细节吗?我在主帖中添加了更多内容以显示我遇到的问题。
  • 您需要在 XML 中使用完全限定名称,例如com.mydomain.mypackage.IconSwitcher,而不仅仅是IconSwitcher。试试看,看看事情是否开始起作用。
  • 不,我仍然有一个空指针错误。它也绝对在IconSwitcher ic = (IconSwitcher) refresh.getActionView(); 线上。如果我注释掉那条线,我不会收到任何错误,但我显然没有得到动态按钮,只有静态图标。我是否需要以任何方式在清单中声明 IconSwitcher?
  • 您可以尝试使用setActionView(new IconSwitcher(...)) 而不是在XML 中设置动作视图类吗?我猜android内部使用MenuItemImpl,如果你这样设置它应该返回一个非空值。此外,您可以直接保留对它的引用...
  • 嗯,我以为我保留了对它的引用,但事实证明我在真正得到它之前在不同的线程中调用了引用。我开始能够操纵它。在这一点上,我想我将不得不菜单项。一个是刷新图标。当它被按下时,我会在它的位置放置一个进度条,而不是尝试更改图标本身。完成后,我会将它们切换回来。
【解决方案2】:

尝试使用:

<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"

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多