Java 动态更改操作栏中的项目标题

Java 动态更改操作栏中的项目标题,java,android,android-actionbar,Java,Android,Android Actionbar,我想做的是:从onClick方法更改操作栏中项目的标题。 创建选项菜单的代码: @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu);

我想做的是:从
onClick
方法更改操作栏中项目的标题。 创建选项菜单的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.option_menu, menu);    
    return super.onCreateOptionsMenu(menu);
}
菜单的我的
选项\u menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/state"
      android:title="@string/title_not_connected"
      android:showAsAction="ifRoom" />
</menu>
正如您所看到的,我正试图通过Id在菜单中查找此项,但我遇到了以下错误:
对于R.menu类型,findItem(int)方法未定义。我正在使用片段,而
ReceiveSectionFragment
使用
R.layout.receive
layout

我如何处理这个问题?也许,我用了错误的方法,把一切都搞错了


我没有使用ActionBar Sherlock。

如果要更改ActionBar菜单,必须调用
InvalidateOptions功能表

然后覆盖创建选项菜单上的
oncreateoptions
,以使用所做的更改重建菜单。不能在为构建菜单提供的方法之外编辑菜单

每次调用
invalidateOptions功能表
时,您的菜单将由
onCreateOptions功能表
方法重建,因此您需要在那里进行所有更改

无论您是否使用ActionBarSherlock,这都是正确的

e、 g:

设置一个变量来保存标题

String MyMenuTitle = "Default Menu";
你的一吻

public void onClick(View view) {
    MyMenuTitle = "My New Menu Title";
}
你的菜单代码

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.option_menu, menu); 

    MenuItem item = menu.findItem(R.id.state);
    item.setTitle(MyMenuTitle);

    return super.onCreateOptionsMenu(menu);
}

要更改操作栏菜单,必须调用
invalidateOptions功能表

然后覆盖创建选项菜单上的
oncreateoptions
,以使用所做的更改重建菜单。不能在为构建菜单提供的方法之外编辑菜单

每次调用
invalidateOptions功能表
时,您的菜单将由
onCreateOptions功能表
方法重建,因此您需要在那里进行所有更改

无论您是否使用ActionBarSherlock,这都是正确的

e、 g:

设置一个变量来保存标题

String MyMenuTitle = "Default Menu";
你的一吻

public void onClick(View view) {
    MyMenuTitle = "My New Menu Title";
}
你的菜单代码

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.option_menu, menu); 

    MenuItem item = menu.findItem(R.id.state);
    item.setTitle(MyMenuTitle);

    return super.onCreateOptionsMenu(menu);
}

应该在要隐藏菜单的片段中插入以下行

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    MenuItem item = (MenuItem) menu.findItem(R.id.your_action);
    item.setVisible(false);
}

应该在要隐藏菜单的片段中插入以下行

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    MenuItem item = (MenuItem) menu.findItem(R.id.your_action);
    item.setVisible(false);
}

还有另一种方法可以在不使菜单失效的情况下执行此操作

首先在onCreate方法之前将MenuItem声明为静态

  static MenuItem item;
然后在OnCreateOptions菜单中初始化处理程序

  @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    item = menu.findItem(R.id.state);

    return true;
}
最后,当您想要更改标题时,请使用setTitle

 item.setTitle("your title");

我希望这有帮助…

还有另一种方法可以做到这一点,而不会使菜单失效

首先在onCreate方法之前将MenuItem声明为静态

  static MenuItem item;
然后在OnCreateOptions菜单中初始化处理程序

  @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    item = menu.findItem(R.id.state);

    return true;
}
最后,当您想要更改标题时,请使用setTitle

 item.setTitle("your title");

我希望这有助于……

它的工作

静态菜单项;//定义全局变量

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.minu_filter, menu);
        menu.findItem(action_enter_manually).setVisible(true);
        // allocation id 
        item = menu.findItem(R.id.action_enter_manually);
    }
在何处呼叫
item.setTitle(“您的标题”)

它在工作

静态菜单项;//定义全局变量

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.minu_filter, menu);
        menu.findItem(action_enter_manually).setVisible(true);
        // allocation id 
        item = menu.findItem(R.id.action_enter_manually);
    }
在何处呼叫
item.setTitle(“您的标题”)

我添加了
invalidateOptionsMenu()
,但我仍然无法生成我的项目,原因是:
没有为类型R.menu定义findItem(int)方法
,然后您在错误的位置调用它。您没有从OnClick处理程序访问菜单的权限。您必须在OnCreateOptions菜单中调用findItem。我已经用一个例子更新了我的答案。是的,但我真正要做的是根据单击的按钮设置这个特定
项目的各种标题,这样就没有帮助了。即使我使用了
invalidateOptions功能表()
,我也会不断地将标题设置为
“新标题”
…这是唯一的方法。如果要更改菜单,必须调用InvalidateOptions菜单,让OnCreateOptions菜单重建菜单。您必须包含代码,以便使用条件语句在新状态下重建菜单。“新标题”就是一个例子。您应该使用实际需要的变量或值。e、 g在OnClick set字符串MyMenuTitle=“My New Menu Title”中,在菜单构建过程中使用它。请再读一遍我的完整答案。你还不明白。我没有解释如何使用变量,因为这是基本的,我假设您知道这一点。我用一个分步指南再次更新了答案。我添加了
invalidateOptionsMenu()
,但我仍然无法构建我的项目,因为:
没有为类型R.menu定义findItem(int)方法。然后您在错误的位置调用了它。您没有从OnClick处理程序访问菜单的权限。您必须在OnCreateOptions菜单中调用findItem。我已经用一个例子更新了我的答案。是的,但我真正要做的是根据单击的按钮设置这个特定
项目的各种标题,这样就没有帮助了。即使我使用了
invalidateOptions功能表()
,我也会不断地将标题设置为
“新标题”
…这是唯一的方法。如果要更改菜单,必须调用InvalidateOptions菜单,让OnCreateOptions菜单重建菜单。您必须包含代码,以便使用条件语句在新状态下重建菜单。“新标题”就是一个例子。您应该使用实际需要的变量或值。e、 g在OnClick set字符串MyMenuTitle=“My New Menu Title”中,在菜单构建过程中使用它。请再读一遍我的完整答案。你还不明白。我没有解释如何使用变量,因为这是基本的,我假设您知道这一点。我用一个分步指南再次更新了答案。