android:以编程方式更改选项菜单项

时间:2011-08-20 16:36:29

标签: java android option menuitem

是否可以通过编程方式更改选项菜单项?有人可以给我一个例子吗?

另外,我想禁用某些项目,这样他们就不会听到点击,是否可能?

12 个答案:

答案 0 :(得分:198)

任何人都需要动态更改菜单选项:

private Menu menu;

// ...

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

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

答案 1 :(得分:30)

menu.xml文件

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

放入你的java文件

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}

答案 2 :(得分:16)

像Nikolay所说,在onPrepareOptionsMenu()中做到这一点。

对于操作栏中的菜单项,您必须使菜单无效 activity.invalidateOptionsMenu();

这里有更详细的描述How can I refresh the ActionBar when onPrepareOptionsMenu switched menu entries?

答案 3 :(得分:7)

如果我必须更改选项菜单的内容,请在onMenuOpened()期间执行。这允许我在用户访问菜单的那一刻检查运行状态。

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }

答案 4 :(得分:7)

禁用某些项目:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

答案 5 :(得分:4)

使用以下几行来添加菜单中的值

getActivity().invalidateOptionsMenu();

尝试这项工作就像是一种魅力。

答案 6 :(得分:3)

试试这段代码:

    private void BatchInsert(DbConnection connection, DbTransaction transaction, DataTable dataTable, string tableName)
    {
        DbDataAdapter adapter = ProviderFactories.GetFactory("Oracle.DataAccess.Client").CreateDataAdapter();
        DbCommand insertCommand = connection.CreateCommand();

        DbParameter parameter1 = insertCommand.CreateParameter();
        parameter.DbType = DbType.String;
        parameter.ParameterName = "@name";
        parameter.SourceColumn = "name";
        insertCommand.Parameters.Add(parameter);

        DbParameter parameter2 = insertCommand.CreateParameter();
        parameter2.DbType = DbType.String;
        parameter2.ParameterName = "@group";
        parameter2.SourceColumn = "group";
        insertCommand.Parameters.Add(parameter2);

        DbParameter parameter3 = insertCommand.CreateParameter();
        parameter3.DbType = DbType.Int32;
        parameter3.ParameterName = "@number";
        parameter3.SourceColumn = "number";
        insertCommand.Parameters.Add(parameter3);

        DbParameter parameter4 = insertCommand.CreateParameter();
        parameter4.DbType = DbType.DateTime;
        parameter4.ParameterName = "@creation";
        parameter4.SourceColumn = "creation";
        insertCommand.Parameters.Add(parameter4);

        insertCommand.CommandType = CommandType.Text;
        insertCommand.CommandText = "INSERT INTO \"TestTableOracleWriter\" (\"name\", \"group\", \"number\", \"creation\") VALUES (:name, :group, :number, :creation)";
        insertCommand.Transaction = transaction;
        insertCommand.UpdatedRowSource = UpdateRowSource.None;

        adapter.InsertCommand = insertCommand;
        adapter.UpdateBatchSize = 0;    
        adapter.Update(dataTable);
    }

答案 7 :(得分:2)

你可以像我一样做一些简单的事情。只需将文本更改为触摸菜单项时所需的内容即可。我需要关闭和打开声音,以及通过触摸它来执行动作的能力。这是我的代码:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.audioOn:
        audioOn = !audioOn;
        if (audioOn)
            item.setTitle("Audio Off");
        else
            item.setTitle("Audio On");
        return true;

    case R.id.touchOn:
        touchOn = !touchOn;
        if (touchOn)
            item.setTitle("Touch Off");
        else
            item.setTitle("Touch On");
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

audioOn和touchOn是在代码的其他部分检查的布尔值。希望这会有所帮助。

答案 8 :(得分:1)

如果您有BottomBar:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

然后你只需要致电:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

答案 9 :(得分:0)

您可以通过以下方式实现您的任务:

private Menu menu;

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

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu = menu;
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_toggle_grid) {
        handleMenuOption(id);
        return true;

    } else if(id == R.id.action_toggle_list){
        handleMenuOption(id);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void handleMenuOption(int id) {
    MenuItem item = menu.findItem(id);
    if (id == R.id.action_toggle_grid){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_list).setVisible(true);
    }else if (id == R.id.action_toggle_list){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_grid).setVisible(true);
    }
}

答案 10 :(得分:0)

科特林代码,用于以编程方式访问工具栏OptionsMenu项并更改文本/图标,..:

1-我们将菜单项放在菜单项文件中,例如:menu.xml,此示例代码:

 <?xml version="1.0" encoding="utf-8"?> 
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2-在类中定义用于访问菜单对象的变量

var menu: Menu? = null

3-在onCreateOptionsMenu中将其初始化:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4-访问代码或乐趣中的菜单项:

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

答案 11 :(得分:0)

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }