我有一个Sherlock片段活动,其中有3个片段。
片段A,片段B,片段C是三个片段。我想仅在片段B中显示完成选项菜单。活动以片段A开始。选择片段B时,会添加完成按钮。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if(!menusInflated){
inflater.inflate(R.menu.security, menu);
menusInflated=true;
}
super.onCreateOptionsMenu(menu, inflater);
}
当我再次启动片段A时,我想选择菜单DONE(在片段B中设置)这样做我就是这样做
setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);
但是这根本没有隐藏,如果首次使用Fragment A启动Activity,它也会给出NullPointerException。
请告诉我这是什么问题。
答案 0 :(得分:92)
试试这个......
您不需要再次覆盖Fragment类中的onCreateOptionsMenu()。可以通过覆盖Fragment类中提供的onPrepareOptionsMenu()方法来更改菜单项可见性。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_search).setVisible(false);
super.onPrepareOptionsMenu(menu);
}
答案 1 :(得分:65)
这是这样做的一种方式:
添加"组"到你的菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group
android:id="@+id/main_menu_group">
<item android:id="@+id/done_item"
android:title="..."
android:icon="..."
android:showAsAction="..."/>
</group>
</menu>
然后,添加一个
Menu menu;
您的活动的变量,并将其设置为onCreateOptionsMenu:
的覆盖@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
// inflate your menu here
}
当您要显示/隐藏菜单时,请在您的活动中添加并使用此功能:
public void showOverflowMenu(boolean showMenu){
if(menu == null)
return;
menu.setGroupVisible(R.id.main_menu_group, showMenu);
}
我并不是说这是最好的/唯一的方式,但对我来说效果很好。
答案 2 :(得分:20)
要在仅需要它们的片段的ActionBar中显示操作项(操作按钮),请执行以下操作:
假设您希望save
按钮仅显示在您接受项目输入的片段中,而不是在您查看项目列表的片段中,请将其添加到OnCreateOptionsMenu
方法中您查看项目的片段:
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (menu != null) {
menu.findItem(R.id.action_save_item).setVisible(false);
}
}
注意:为此,您需要片段中的onCreate()
方法(您要隐藏项目按钮,我们示例中的项目视图片段)并添加{{ 1}}像这样:
setHasOptionsMenu(true)
可能不是最佳选择,但它很有效,而且很简单。
答案 3 :(得分:6)
这肯定会起作用我猜...
// Declare
Menu menu;
MenuItem menuDoneItem;
// Then in your onCreateOptionMenu() method write the following...
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
this.menu=menu;
inflater.inflate(R.menu.secutity, menu);
}
// In your onOptionItemSelected() method write the following...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.done_item:
this.menuDoneItem=item;
someOperation();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// Now Making invisible any menu item...
public void menuInvisible(){
setHasOptionsMenu(true);// Take part in populating the action bar menu
menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);
menuRefresh.setVisible(false); // make true to make the menu item visible.
}
//Use the above method whenever you need to make your menu item visible or invisiable
您也可以参考此link了解更多详情,这是非常有用的。
答案 4 :(得分:5)
MenuItem Import = menu.findItem(R.id.Import);
Import.setVisible(false)
有关详情,请参阅:http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html
答案 5 :(得分:3)
试试这个
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.custom_actionbar, menu);
menu.setGroupVisible(...);
}
答案 6 :(得分:1)
您可以为每个片段创建一个菜单,以及一个标记当前正在使用哪个片段的全局变量。 并检查onCreateOptionsMenu中变量的值并膨胀正确的菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (fragment_it == 6) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.custom_actionbar, menu);
}
}
答案 7 :(得分:1)
通过设置菜单中所有项目的可见性,appbar菜单或溢出菜单将自动隐藏
实施例
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language).setVisible(true);
return super.onCreateOptionsMenu(menu);
}
在转到其他片段之前,请使用以下代码:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
答案 8 :(得分:0)
尽管这个问题很老并且已经回答了。对此有一个比上面提到的更简单的答案。您不需要使用任何其他变量。 您可以在操作栏上创建所需片段的按钮,而不是执行可见性内容(显示/隐藏)。
在片段中添加以下内容,无论你需要什么菜单项。
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
示例menu.xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_addFlat"
android:icon="@drawable/add"
android:showAsAction="ifRoom|withText"
android:title="@string/action_addFlat"/>
</menu>
处理onclick事件与往常一样。
答案 9 :(得分:0)
您好我得到了最好的解决方案,假设您必须在创建Menu方法中隐藏特定项目并在其他片段中显示该项目。我举两个菜单项目的例子是编辑,其他是删除。例如,菜单xml如下所示:
sell_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/action_edit"
android:icon="@drawable/ic_edit_white_shadow_24dp"
app:showAsAction="always"
android:title="Edit" />
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_white_shadow_24dp"
app:showAsAction="always"
android:title="Delete" />
现在覆盖您活动中的两种方法&amp;将字段变量mMenu设为:
private Menu mMenu; // field variable
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.sell_menu, menu);
this.mMenu = menu;
menu.findItem(R.id.action_delete).setVisible(false);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_delete) {
// do action
return true;
} else if (item.getItemId() == R.id.action_edit) {
// do action
return true;
}
return super.onOptionsItemSelected(item);
}
在您的活动&amp;中制作以下两种方法从片段中调用它们来隐藏并显示您的菜单项。这些方法如下:
public void showDeleteImageOption(boolean status) {
if (menu != null) {
menu.findItem(R.id.action_delete).setVisible(status);
}
}
public void showEditImageOption(boolean status) {
if (menu != null) {
menu.findItem(R.id.action_edit).setVisible(status);
}
}
从我这里解决,我认为这个解释会对你有帮助。
答案 10 :(得分:0)
晚会,但上面的答案对我来说似乎没有用。
我的第一个标签片段(使用内部标签的getChildFragmentManager())具有显示搜索图标的菜单,并使用android.support.v7.widget.SearchView在内部标签片段内搜索,但导航到其他标签(也是有内部选项卡使用getChildFragmentManager())不会删除搜索图标(因为不需要),因此仍然可以访问没有任何功能,也许因为我使用下面(即每个内部选项卡的外部主选项卡)
getChildFragmentManager();
但是我在包含/使用getChildFragmentManager()的片段中使用下面的内部标签。
//region onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
//access setHasOptionsMenu()
setHasOptionsMenu(true);
}
//endregion onCreate
然后清除onPrepareOptionsMenu里面的菜单项片段(搜索图标和功能)
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
//clear the menu/hide the icon & disable the search access/function ...
//this will clear the menu entirely, so rewrite/draw the menu items after if needed
menu.clear();
}
运行良好并使用搜索图标功能导航回标签/内部标签,重新显示搜索图标&amp;功能
希望这会有所帮助......
答案 11 :(得分:0)
好的,我花了几个小时来获得这个解决方案。显然,您可以将菜单项从工具栏中获取到活动或片段中的任何位置。所以就我而言。
var menuItem = toolbar.menu;
现在从菜单项中获取特定项
favIcon = menuItem.findItem(R.id.favourite);
注意:favIcon 是 MenuItem 声明全局
现在如果你可以为这个图标做任何你想做的事情
例如。让它不可见
favIcon?.isVisible=false
答案 12 :(得分:0)
由于某种原因,该方法对我不起作用,这就是我根据已接受的解决方案解决它的方法
//This should be in on create
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
showOverflowMenu(false);
}
},100);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
getMenuInflater().inflate(R.menu.options_menu, menu);
return true;
}
public void showOverflowMenu(boolean showMenu){
if(menu == null)
return;
menu.setGroupVisible(R.id.grp, showMenu);
}