如何调用public boolean onPrepareOptionsMenu(菜单菜单)

时间:2015-07-30 01:51:15

标签: java android android-actionbar

我正在使用Java和Android Studio。我需要更改操作栏上的图像。我需要做的是根据从远程传感器接收的读数更改我在操作栏上显示的图像。因此,我不能使用可点击的方法,而是我有一些代码,当从传感器接收数据时激活。然后代码分析数据并决定要显示的几个图像中的哪一个。然后程序需要更新操作栏图像。这是我需要你帮助的部分。我想我应该使用onPrepareOptionsMenu来更新图像。但是,我似乎无法使代码正确调用onPrepareOptionsMenu。特别是,onPrepareOptions使用参数(菜单菜单)。我似乎无法正确指定第二个菜单,因为它总是给出错误。以下代码给出: “需要android.view.Menu找到int”。如果我用null初始化菜单,我得到一个空引用错误。有任何建议如何纠正我的代码或可能做一些完全不同的事情,以便能够更新图像?谢谢。下面是我的java代码。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    menu.clear(); // Clear the menu first

    Log.d(TAG, " Before inflation");
    getMenuInflater().inflate(R.menu.gatt_services, menu);
    Log.d(TAG, "Before the findItem");
    menu.findItem(R.id.menu_batlevel).setIcon(R.drawable.low25);

    return super.onPrepareOptionsMenu(menu);
}

用以下代码调用onPrepareOptionsMenu的代码:

            ...
            else if (dataType == 2.0) {
                Menu menu = (R.menu.gatt_services);
                getMenuInflater().inflate(R.menu.gatt_services, menu);
                onPrepareOptionsMenu(Menu menu);
            ...

操作栏的XML代码。我想要更改的图片是商品ID / menu_batlevel:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_refresh"
          android:checkable="false"
          android:orderInCategory="1"
          android:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_batlevel"
        android:checkable="false"
        android:icon="@drawable/discharged"
        android:title="BatLev"
        android:orderInCategory="2"
        android:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_connect"
          android:title="@string/menu_connect"
          android:orderInCategory="100"
          android:showAsAction="ifRoom|withText"/>
    <item android:id="@+id/menu_disconnect"
          android:title="@string/menu_disconnect"
          android:orderInCategory="101"
          android:showAsAction="ifRoom|withText"/>
</menu>

我的解决方案如下所示。我将更新图像的if语句放入onCreateOptionsMenu:

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.d(TAG, "onCreateOptions Before inflation");
        getMenuInflater().inflate(R.menu.gatt_services, menu);   
        ...
        if (dataType == 2.0){
            if (bat_level < 10) {
        MenuItem batItem = menu.findItem(R.id.menu_batlevel);
        batItem.setIcon(R.drawable.discharged);
            }
        ...

我添加了一个课程:

class VersionHelper
{
    static void refreshActionBarMenu(Activity activity)
    {
        activity.invalidateOptionsMenu();
    }
}

我从我的程序中调用该类:

...
                else if (dataType == 2.0) {
                    VersionHelper.refreshActionBarMenu(DeviceControlActivity.this);
...

以上代码正常运行。正如你所知,我是java的新手,所以如果你看到这段代码有问题或有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果要更改现有菜单项上的图像,可以在创建菜单项时保存对该菜单项的引用,如下所示:

private MenuItem photoMenuItem;

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    inflater.inflate(R.menu.menu_end_details, menu);

    // find the photo menu and save it
    photoMenuItem = menu.findItem(R.id.photoMenuItem);
}

然后在更新菜单项时,只需调用setIcon:

if (photoMenuItem != null)
{
    photoMenuItem.setIcon(R.drawable.camera_active);
}

如果您想决定是否显示特定菜单项,可以对存在可能发生变化的项目调用setVisible而不是setIcon。