我试图从onOptionsItemSelected(MenuItem项目)方法之外更改菜单项的标题。

我已经做了以下工作;

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

但是,我希望能够修改这个方法之外的特定菜单项的标题。


当前回答

声明你的菜单字段。

private Menu menu;

下面是onCreateOptionsMenu()方法

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

下面将是您的名称setter活动。要么通过单击按钮,要么通过条件代码

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

这对我很管用。

其他回答

声明你的菜单字段。

private Menu menu;

下面是onCreateOptionsMenu()方法

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

下面将是您的名称setter活动。要么通过单击按钮,要么通过条件代码

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

这对我很管用。

你可以创建一个全局的“Menu”对象,然后在onCreateOptionMenu中分配它

public class ExampleActivity extends AppCompatActivity
    Menu menu;

然后在这里赋值

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    this.menu = menu;
    return true;
}

然后使用赋值的Menu对象获取所需的项

menu.findItem(R.id.bedSwitch).setTitle("Your Text");

我也遇到过这个问题。在我的例子中,我想将字符串设置为 使用getString反映额外的信息。

如上所述,您需要在菜单中找到正确的menuItem,并在onprepareoptionmenu方法中设置它。上面的解决方案不能处理项目在子菜单中的情况,为此,您需要在子菜单中搜索项目。我写了一个小的Kotlin递归函数来允许我处理多个项目。下面的代码…

override fun onPrepareOptionsMenu(menu: Menu) {
...
    menu.menuSetText(R.id.add_new_card,
        getString(R.string.add_card, currentDeck.deckName))
...
}
private fun Menu.getMenuItem(idx: Int, itemId: Int): MenuItem? {
    Log.d(TAG, "getMenuItem: $idx of ${this.size()}")
    if (idx >= size()) return null
    val item = getItem(idx)
    if (item.hasSubMenu()) {
        val mi = item.subMenu.getMenuItem(0, itemId)
        // mi non-null means we found item.
        if (mi != null)
            return mi
    }
    if (item != null && item.itemId == itemId)
        return item
    return getMenuItem(idx + 1, itemId)
}
fun Menu.menuSetText(itemId: Int, title: String) {
    val menuItem = getMenuItem(0, itemId)
    if (menuItem != null)
        menuItem.title = title
    else
        Log.e(TAG,
            "menuSetText to \"$title\": Failed to find ${
                "itemId:0x%08x".format(itemId)}"
        )
}

在我看来,你想要在一个本地方法内更改菜单的内容,这个方法随时被调用,无论何时发生事件,或在活动UI线程。

你为什么不采取菜单的实例在onprepareoptionmenu的全局变量时,这是覆盖和使用你的方法。确保在事件发生时(如按钮单击),或在活动UI线程,处理程序或异步任务后执行时调用此方法。

您应该事先知道要更改的菜单项的索引。清除菜单后,您需要扩展菜单XML并更新项目的名称或图标。

对于需要静态设置标题的人。 这可以在AndroidManifest.xml中完成

<activity
    android:name=".ActivityName"
    android:label="Title Text" >
</activity>