我使用的菜单抽屉里面有更多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);
}
答案 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}}。
Activity
和Fragment
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);
}