隐藏/显示操作栏选项菜单项为不同的片段
我有一个Sherlock碎片活动,里面有3个碎片。
片段A,片段B,片段C是三个片段。 我只想在Fragment B中显示完成的选项菜单。
活动从Fragment A开始。当Fragment B被select完成时,button被添加。
@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); }
当我再次启动片段AI要选项菜单完成(这是设置在片段B)为此我这样做
setHasOptionsMenu(false); MenuItem item = (MenuItem) menu.findItem(R.id.done_item); item.setVisible(false);
但是,这并不是隐藏的,当它首先使用Fragment A开始时,它也会给出NullPointerException。
请让我知道是什么问题。
这是这样做的一种方式:
添加一个“组”到你的菜单中:
<?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;
variables为您的活动,并将其设置在您的覆盖onCreateOptionsMenu:
@Override public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; // inflate your menu here }
之后,当你想显示/隐藏菜单时,添加和使用这个function到你的活动中:
public void showOverflowMenu(boolean showMenu){ if(menu == null) return; menu.setGroupVisible(R.id.main_menu_group, showMenu); }
我并不是说这是最好的/唯一的方式,但是对我来说这很好。
尝试这个…
你不需要重写你的Fragment类中的onCreateOptionsMenu()。 菜单项的可见性可以通过覆盖片段类中的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); }
要在仅需要它们的片段的ActionBar中显示操作项(操作button),请执行以下操作:
比方说,你希望save
button只显示在你接受项目input的片段中,而不是在你查看项目列表的片段中,把它添加到你查看项目的片段的OnCreateOptionsMenu
方法:
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (menu != null) { menu.findItem(R.id.action_save_item).setVisible(false); } }
注:为了这个工作,你需要在你的Fragment中的onCreate()
方法(在这里你想隐藏项目button,在我们的例子中的项目视图片段),并像这样添加setHasOptionsMenu(true)
:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
可能不是最好的select,但它的作品,它很简单。
这将工作肯定我猜…
// 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
你也可以参考这个链接的更多细节,这是一个非常有用的。
MenuItem Import = menu.findItem(R.id.Import); Import.setVisible(false)
有关更多参考资料,请参阅: http : //androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html
尝试这个
@Override public boolean onCreateOptionsMenu(Menu menu){ MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.custom_actionbar, menu); menu.setGroupVisible(...); }
您可以为每个片段创build一个菜单,还可以为全局variables标记正在使用哪个片段。 并检查onCreateOptionsMenu中的variables的值,并充气正确的菜单
@Override public boolean onCreateOptionsMenu(Menu menu) { if (fragment_it == 6) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.custom_actionbar, menu); } }
即使这个问题是古老的,回答。 比上面提到的有一个更简单的答案。 您不需要使用任何其他variables。 你可以在操作栏上创buildbutton,而不需要显示可见的东西(显示/隐藏)。
无论你需要菜单项,在片段中添加以下内容。
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事件是一如既往。
你好,我得到了这个最好的解决scheme,假设如果你要隐藏一个特定的项目创build菜单方法,并显示在其他片段的项目。 我以两个菜单项为例,一个是编辑,另一个是删除。 例如,菜单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" />
现在在你的活动中重写这两个方法,并将一个字段variablesmMenu设置为:
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); }
在您的活动中制作以下两个方法,并从片段调用它们来隐藏并显示您的菜单项。 这些方法如下:
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); } }
这是从我身边解决,我认为这个解释会帮助你。