【发布时间】: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);
当我尝试设置可见性时,还会给我一个空指针。我的参考文献有什么问题?
【问题讨论】:
-
这不是在 setActionView 失败,而是在你正在执行 (MenuItem)findViewById(R.id.main_menu_refresh) 的地方失败。将 ActionItemView 转换为 MenuItem 显然是 ClassCastException。
标签: android android-actionbar actionview