java - 如何调用 public boolean onPrepareOptionsMenu(Menu menu)

标签 java android android-actionbar

我正在使用 Java 和 Android Studio。我需要更改操作栏上的图像。我需要做的是根据从远程传感器接收到的读数来更改在操作栏上显示的图像。因此,我无法使用可点击的方法,而是使用一些代码在从传感器接收到数据时激活。然后代码分析数据并决定显示几幅图像中的哪一幅。然后程序需要更新操作栏图像。这是我需要你帮助的部分。我想我应该使用 onPrepareOptionsMenu 来更新图像。但是,我似乎无法正确调用 onPrepareOptionsMenu 的代码。特别是,onPrepareOptions 使用参数(Menu 菜单)。我似乎无法正确指定第二个菜单,因为它总是给出错误。下面的代码给出: “需要 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 代码。我试图更改的图像是 item 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 新手,因此如果您发现此代码有问题或有更好的方法,请告诉我。

最佳答案

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

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 。

关于java - 如何调用 public boolean onPrepareOptionsMenu(Menu menu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713976/

相关文章:

java - 根据JAVA中的配置值获取不同的类

java - android 中的事件处理程序 - 设计器时间自动化并在单独的处理程序中处理 2 个 View

java - 使用sqlite数据库按列获取特定数据

android - Cordova 相机不工作

android - 始终在支持操作栏中显示菜单项

android - 操作栏菜单显示在屏幕外

java - 如何在 IntelliJ IDEA 14 中启用 "View External Documentation"选项

android - 在 CircleImageView 中缩放不同大小的图像的问题

android - geocoder.getFromLocation 函数抛出 "Timed out waiting for server response"异常

android - ActionBar 选项卡和主从布局