动态添加/删除菜单项menuItem

13

我有一个问题,我想以编程方式向工具栏(材料设计)添加项目。

这是我的菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item android:id="@+id/action_settings" android:title="@string/action_settings"
        android:orderInCategory="100" android:showAsAction="never" />
</menu>

我知道如何改变文本、颜色、背景以及 @override 监听器。

toolbar.setBackgroundColor
toolbar.setTextColor
toolbar.setNavigationIcon
toolbar.setText

我不知道如何添加一个带有类别“android:orderInCategory="300"”的菜单项

谢谢。

注意:我拥有所有的片段,但没有1个活动。

Tree - > Activity - > Fragment1(here add menu item) - > Fragment2(add/remove menu item) - > Fragmentx ..
6个回答

10

尝试此工具栏具有选项getMenu(),该选项返回菜单

private static final String placeholder1="Something";
private static final int FIRST_ID=Menu.FIRST;
private static final int SECOND_ID=Menu.FIRST+1;


//To add an item
toolbar.getMenu().add(Menu.NONE,FIRST_ID,Menu.NONE,R.string.placeholder1);
toolbar.getMenu().add(Menu.NONE,SECOND_ID,Menu.NONE,R.string.placeholder2);

//and to remove a element just remove it with id
toolbar.getMenu().removeItem(FIRST_ID);

5

首先,在您的xml文件中放置要显示/隐藏的项目。假设它是您代码中提到的"action_settings",请重写"onCreateOptionsMenu"。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your_menu, menu);
    MenuItem item = menu.findItem(R.id.action_settings);
    if (yourConditionToShow) {
        item.setVisible(true);
    } else {
        item.setVisible(false);
    }
    return true;
}

2
我认为应该在onPrepareOptionsMenu()方法中测试条件。 - Zach

4
如果您无法访问工具栏,可以执行以下操作:
1 - 通过onCreateOptionsMenu()将项目添加到菜单中:
public boolean onCreateOptionsMenu(Menu menu){

  super.onCreateOptionsMenu(menu);

  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.my_item_id, menu);

  return true;
}

2 - 创建一个布尔值,如果该项必须可见,则设置为true

3 - 根据onPrepareOptionsMenu()中布尔值的值来隐藏或显示该项

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

  MenuItem mi = menu.findItem(R.id.my_item_id);

  if(displayItem)
    mi.setVisible(true);
  else
    mi.setVisible(false);

  return super.onPrepareOptionsMenu(menu);
}

1
在你的onCreateOptionsMenu中,尝试使用以下代码。
//menu.add("groupId", "ItemId", "OrderID", "title")
MenuItem item = menu.add(1, 100, 300, "Settings");
item.setIcon(R.drawable.ic_launcher);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

你也可以像 XML 一样添加设置。你可以通过在 onOptionsItemSelected 中检查 itemid("100") 来进行检查。
如果您不想使用 100 作为 ItemId,您可以创建 ids 资源文件。并可以像这样使用,
//R.id.action_settings is from ids resource file
MenuItem item = menu.add(1, R.id.action_settings, 300, "Settings");

0

1个解决方案:

@Chitrang 感谢您的想法,我用这行代码解决了:

toolbar.inflateMenu(R.menu.menu_activity1);
toolbar.inflateMenu(R.menu.menu_activity2);
toolbar.inflateMenu(R.menu.menu_activityx);

选项选择 R.menu.item1,2,x

解决方案 2: 创建自定义工具栏:使用 "android.support.v7.widget.Toolbar",您可以管理所有图标。

 <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"></LinearLayout>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Toolbar Title"
                android:layout_gravity="center"
                android:id="@+id/toolbar_title" />
        </LinearLayout>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="right"
            android:layout_marginRight="15dp">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="24dp"
                android:id="@+id/imageView10"
                android:src="@drawable/sun"
                android:adjustViewBounds="true" />
        </LinearLayout>


    </LinearLayout>

-1
在您的菜单XML文件中,您可以添加一个不可见的菜单项(android:visible=false),并在需要时呈现为可见。

你如何将其渲染为可见的? - Chief
@Chief 获取该项的ID,然后设置其可见性。 - Jaco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接