在某些片段中隐藏MenuItem

时间:2014-02-01 13:16:49

标签: android android-fragments android-optionsmenu

我使用的菜单抽屉里面有更多Fragment个。在一些Fragment中,我有菜单项REFRESH,但在某些片段中我想隐藏此菜单项(我不想显示菜单,但我不想隐藏ActionBar)。

我尝试将覆盖onCreateOptionsMenu()添加到Fragment,我不想显示此菜单项,但我无法让它工作。我尝试了许多方式在代码中看到注释行。有什么问题在哪里?当我在MainActivity中调用onPrepareOptionsMenu()时激活菜单抽屉时,最后这个菜单项会隐藏,但是当我在Fragment时我需要这样做。

Fragment我想隐藏菜单项REFRESH:

 public class FindPeopleFragment extends Fragment {
    public FindPeopleFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
        //setHasOptionsMenu(false);
        return rootView;
    }

    private Menu menu=null;
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        inflater.inflate(R.menu.main, menu);
        this.menu=menu;
        menu.findItem(R.id.refresh).setVisible(false);
        getActivity().invalidateOptionsMenu();
        //setHasOptionsMenu(false);
        super.onCreateOptionsMenu(menu,inflater);
    }
}

MainActivity定义了MENU DRAWER:

 //Slide menu item click listener
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    switch (item.getItemId()) {
        case R.id.refresh:
            Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

 // Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.refresh).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}

14 个答案:

答案 0 :(得分:157)

在要隐藏项目的片段中

@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem item=menu.findItem(R.id.action_search);
    if(item!=null)
       item.setVisible(false);
}

和片段的onCreate()

 setHasOptionsMenu(true);

答案 1 :(得分:37)

在您不想显示任何菜单选项的Fragment中,setHasOptionsMenu(false);中需要onCreate(),如下所示:

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

但是,您要隐藏的菜单(REFRESH)属于MainActivity。这就是它总是被展示的原因。由于您要在Fragment级别控制菜单(而不是显示Activity选项菜单),我的建议是从Activity中删除菜单代码并在您的Fragment中实施{1}}。

ActivityFragment s各自都有自己独立的菜单。请参阅此link

答案 2 :(得分:26)

请试试这个

~/.AndroidStudioX.X/config/templates/Android.xml

并将其放在你的碎片上onCreate()

@Override 
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
}

答案 3 :(得分:14)

在片段类中

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

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

答案 4 :(得分:11)

我只是使用下面的代码将menuitem隐藏在片段中,我不想使用它。 注意:请阅读评论

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment
    String shareVisible=whichFragment.getClass().toString();
    if(shareVisible.equals(AccFragment.class.toString())
            ||shareVisible.equals(SocFragment.class.toString())
            ||shareVisible.equals(DevFragment.class.toString())
            ){
        MenuItem item=menu.findItem(R.id.action_share);
        item.setVisible(false);
    }
    return super.onCreateOptionsMenu(menu);
}

答案 5 :(得分:2)

在科特林

override fun onPrepareOptionsMenu(menu: Menu) {
    val item: MenuItem = menu.findItem(R.id.action_search)
    item.isVisible = false
}

在您片段的onCreate()中 setHasOptionsMenu(true)

答案 6 :(得分:1)

有许多不同版本的类似解决方案但遗憾的是,它们都不适用于我。我正在分享最终对我有用的隐藏整个溢出菜单的多个菜单项。想到也许它对任何人都有用。

我将菜单分组为id,然后引用id

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.setGroupVisible(R.id.menu_overflow, false);
    super.onPrepareOptionsMenu(menu);
}

如果要隐藏任何单个菜单项,则可以使用

menu.getItem(R.id.action_licenses).setVisible(false);

重要的是,您应该setOptionsMenu(true)

中有onViewCreated()
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setHasOptionsMenu(true);

答案 7 :(得分:1)

onCreateView()中致电super.onCreateOptionsMenu()

请勿在片段的onCreateOptionMenu()中调用 menu.clear(),而应调用select,因为这将用活动菜单覆盖现有菜单

这对我来说很有效。

答案 8 :(得分:1)

在Kotlin中为需要的人

db.products.aggregate([
  {
    "$unwind": {
      "path": "$description.activeIngredients",
      "preserveNullAndEmptyArrays": false
    }
  },
  {
    "$lookup": {
      "from": "ingredients",
      "localField": "description.activeIngredients._id",
      "foreignField": "_id",
      "as": "description.activeIngredients.name"
    }
  },
  {
    "$addFields": {
      "description.activeIngredients.name": {
        "$arrayElemAt": [
          "$description.activeIngredients.name.name",
          0
        ]
      }
    }
  },
  {
    "$lookup": {
      "from": "ingredients",
      "let": {
        sub: "$description.activeIngredients.subIngredient"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              "$setIsSubset": [
                [
                  "$_id"
                ],
                {
                  $map: {
                    input: "$$sub",
                    as: "datum",
                    in: "$$datum._id"
                  }
                }
              ]
            }
          }
        }
      ],
      "as": "subIngredients"
    }
  },
  {
    "$addFields": {
      "description.activeIngredients.subIngredient": {
        $map: {
          input: "$description.activeIngredients.subIngredient",
          as: "sub",
          in: {
            "$mergeObjects": [
              "$$sub",
              {
                name: {
                  $arrayElemAt: [
                    "$subIngredients.name",
                    {
                      "$indexOfArray": [
                        "$subIngredients._id",
                        "$$sub._id"
                      ]
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "ingredients": {
        "$push": "$description.activeIngredients"
      },
      "description": {
        "$first": "$description"
      },
      "title": {
        "$first": "$title"
      }
    }
  }
])
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)
}

答案 9 :(得分:0)

如果您在活动级别托管操作栏,或者在创建菜单的相同片段中解决它。这样您就不必将其添加到您不想显示的每个其他片段上:

public override void OnDestroy()
{
    base.OnDestroy();
    HasOptionsMenu = false;
}

答案 10 :(得分:0)

将这些功能添加到片段

  @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setHasOptionsMenu(true);
        }
        @Override
        public void onPrepareOptionsMenu(Menu menu) {
            MenuItem item=menu.findItem(R.id.delete);
            item.setVisible(false);
        }

答案 11 :(得分:0)

首先,在具有工具栏的Activity中,创建一种方法来为您设置overflow menu

public void setUpOptionMenu(Toolbar toolbar){
    this.setSupportActionBar(toolbar);
}

在片段onCreateView()方法中,获取当前活动的引用并调用您的活动setUpOptionMenu()方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    ...
    ...
    public void ((YourActivityName)this.getActivity()).setUpOptionMenu(null);
    ...
    ...
}

干杯!

答案 12 :(得分:0)

仅在您的片段中覆盖以下方法,它就会起作用。

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    getActivity().getMenuInflater().inflate(R.menu.drawer, menu);
}

答案 13 :(得分:-1)

只需使用findItem找到要隐藏的项目,然后将其可见性设置为false

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem item = menu.findItem(R.id.action_settings);
    item.setVisible(false);
}