我正在尝试从onOptionsItemSelected(MenuItem item)
方法之外更改菜单项的标题。
我已经做了以下事情;
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;
}
但是我希望能够修改此方法之外的特定菜单项的标题。
答案 0 :(得分:356)
我建议将活动中的引用保存到您在onCreateOptionsMenu中收到的Menu对象,然后使用它来检索需要在需要时进行更改的MenuItem。例如,您可以执行以下操作:
public class YourActivity extends Activity {
private Menu menu;
private String inBedMenuTitle = "Set to 'In bed'";
private String outOfBedMenuTitle = "Set to 'Out of bed'";
private boolean inBed = false;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Create your menu...
this.menu = menu;
return true;
}
private void updateMenuTitles() {
MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
if (inBed) {
bedMenuItem.setTitle(outOfBedMenuTitle);
} else {
bedMenuItem.setTitle(inBedMenuTitle);
}
}
}
或者,您可以覆盖onPrepareOptionsMenu以在每次显示菜单时更新菜单项。
答案 1 :(得分:100)
正如JxDarkAngel建议的那样,在活动的任何地方调用此内容,
invalidateOptionsMenu();
然后覆盖:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
int savedRoute = mPrefs.getInt(getString(R.string.saved_route), 0);
if (savedRoute > 0) {
menu.findItem(R.id.action_route).setTitle("Route " + savedRoute);
}
return super.onPrepareOptionsMenu(menu);
}
是一个更好的选择。我使用了https://stackoverflow.com/a/17496503/568197
的答案答案 2 :(得分:7)
你可以这样创建一个全局的“菜单”对象,然后在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");
答案 3 :(得分:5)
创建一个setOptionsTitle()方法并在类中设置一个字段。如:
String bedStatus = "Set to 'Out of Bed'";
...
public void setOptionsTitle(String status)
{
bedStatus = status;
}
现在填充菜单时,将标题更改为您的状态:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(bedStatus);
// Return true so that the menu gets displayed.
return true;
}
答案 4 :(得分:3)
您最好使用覆盖onPrepareOptionsMenu
menu.Clear ();
if (TabActual == TabSelec.Anuncio)
{
menu.Add(10, 11, 0, "Crear anuncio");
menu.Add(10, 12, 1, "Modificar anuncio");
menu.Add(10, 13, 2, "Eliminar anuncio");
menu.Add(10, 14, 3, "Actualizar");
}
if (TabActual == TabSelec.Fotos)
{
menu.Add(20, 21, 0, "Subir foto");
menu.Add(20, 22, 1, "Actualizar");
}
if (TabActual == TabSelec.Comentarios)
{
menu.Add(30, 31, 0, "Actualizar");
}
答案 5 :(得分:3)
我使用此代码来修饰我的底部导航项
BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");
答案 6 :(得分:2)
声明您的菜单字段。
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);
}
以下将是您的名字制定者活动。通过按钮单击或通过条件代码
public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}
这对我有用。
答案 7 :(得分:0)
在我看来,您想要在本地方法中更改菜单的内容,并且无论何时发生事件,或者在活动UI线程中,都会随时调用此方法。
为什么不在onPrepareOptionsMenu中的全局变量中使用Menu的实例,当它被覆盖并在你的这个方法中使用时。确保在发生事件时(例如按钮单击)或在活动UI线程,处理程序或异步任务后执行时调用此方法。
您应事先知道要更改的此菜单项的索引。清除菜单后,您需要膨胀菜单XML并更新项目的名称或图标。
答案 8 :(得分:0)
对于需要静态设置标题的人。 这可以在AndroidManifest.xml
中完成<activity
android:name=".ActivityName"
android:label="Title Text" >
</activity>
答案 9 :(得分:0)
我需要更改片段的菜单图标。对于片段,我对查尔斯的答案做了一些改动:
private Menu top_menu;
//...
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
//...
rootview = inflater.inflate(R.layout.first_content,null);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_menu, menu);
this.top_menu = menu;
}
// my procedure
private void updateIconMenu() {
if(top_menu!= null) {
MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
nav_undo.setIcon( R.drawable.back);
}
}
答案 10 :(得分:0)
您可以这样操作,并且不需要专用变量:
Toolbar toolbar = findViewById(R.id.toolbar);
Menu menu = toolbar.getMenu();
MenuItem menuItem = menu.findItem(R.id.some_action);
menuItem.setTitle("New title");
或者稍微简化一下:
MenuItem menuItem = ((Toolbar)findViewById(R.id.toolbar)).getMenu().findItem(R.id.some_action);
menuItem.setTitle("New title");
仅在创建菜单后有效。