Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改操作栏中菜单项的视图_Android_Android Actionbar_Actionview - Fatal编程技术网

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

Android 更改操作栏中菜单项的视图,android,android-actionbar,actionview,Android,Android Actionbar,Actionview,我正在尝试在我的应用程序中实现刷新按钮,以允许用户手动重新同步到web服务器。代码是有效的,但我很难理解动作视图(至少,我认为这是我应该使用的) 我的菜单项在这里: <item android:id="@+id/main_menu_refresh" android:enabled="true" android:icon="@drawable/refresh" android:orderInCategory="1" android:showAsActi

我正在尝试在我的应用程序中实现刷新按钮,以允许用户手动重新同步到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>
这也不起作用,在
setActionView
上给了我一个空指针错误

我需要一个解决方案,我可以从任何功能调用(有一个自动同步期间开始,我希望ProgressBar显示期间以及),并能够返回到它的静态图标后

我试着通读一遍,但我很难理解答案的意思。我觉得我只是想照上面说的做,但我想不是。非常感谢您的帮助

编辑:对于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>

当我尝试设置可见性时,也会给我一个空指针。我的引用有什么问题?

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

class MyViewItem extends LinearLayout
使用
addView
在其构造函数中添加一个
ProgressBar
和一个
ImageView
作为子项,并在代码需要时将这些子项的可见性设置为
GONE
VISIBLE

尝试使用:

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

你有没有试着这样取菜单项

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

我很难理解。你能给我更多关于这个自定义类的细节吗?我在主要帖子中添加了更多内容,以说明我遇到的问题。您需要在XML中使用完全限定名,例如
com.mydomain.mypackage.IconSwitcher
,而不仅仅是
IconSwitcher
。试试看,看看是否开始工作。不,我仍然有一个空指针错误。它肯定也在
IconSwitcher ic=(IconSwitcher)refresh.getActionView()上行。如果我把那行注释掉,我不会得到任何错误,但我显然不会得到一个动态按钮,只有静态图标。我是否需要以任何方式在清单中声明IconSwitcher?是否可以尝试使用
setActionView(新IconSwitcher(…)
而不是在XML中设置action view类?我猜android内部使用的是
menuitempl
,如果这样设置,它应该返回一个非空值。另外,你可以直接保留对它的引用…嗯,我以为我是在保留对它的引用,但事实证明,在我真正得到它之前,我是在另一个线程中调用引用的。我开始能够操纵它了。在这一点上,我想我将不得不选择菜单项。一个是刷新图标。当它被按下时,我会在它的位置上放一个进度条,而不是试图改变图标本身。完成后,我会把它们换回去。我知道了。我找到了前一个问题。从那里,我找到了谷歌写的代码。它基本上是复制和粘贴的,并且工作得很好。这在setActionView中不是失败的,而是在您正在执行(MenuItem)findViewById(R.id.main\u menu\u refresh)的时候失败的。将ActionItemView强制转换为MenuItem显然是ClassCastException。
<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);