我试图从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;
}
但是,我希望能够修改这个方法之外的特定菜单项的标题。
你可以创建一个全局的“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)}"
)
}