我有一个带有FrameLayout和菜单的ActionBar活动。当用户点击菜单项时,我用相关的新片段替换片段。但是,我看不到一种明显的方法来删除所选片段的菜单项。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
StudyFragment startFragment = new StudyFragment();
startFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add
(R.id.container, startFragment).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_study:
replaceFragment((Fragment)new StudyFragment());
break;
case R.id.action_list:
replaceFragment((Fragment)new ListFragment());
break;
// etc
}
return super.onOptionsItemSelected(item);
}
private void replaceFragment(Fragment f) {
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, f);
transaction.addToBackStack(null);
transaction.commit();
}
changing menus上的Google文档说禁用onPrepareOptionsMenu中的菜单 - 但我如何知道选择了哪个项目?
- 已实施解决方案 -
使用下面的Muhammed Refaat解决方案,我在课堂上增加了两名新成员:
private Menu activityMenu;
private MenuItem curMenuItem;
将它们设置在onCreateOptionsMenu
中activityMenu = menu;
curMenuItem = activityMenu.findItem(R.id.action_study);
curMenuItem.setVisible(false);
并在onOptionsItemSelected
上更改了它们curMenuItem.setVisible(true);
curMenuItem = activityMenu.findItem(id);
curMenuItem.setVisible(false);
答案 0 :(得分:8)
首先获取要删除的项目:
MenuItem item = menu.findItem(R.id.your_action);
然后设置它的可见性false
:
item.setVisible(false);
如果问题在于获取菜单(因为它不在片段中),您可以轻松地从包含菜单的活动中获取context
并通过它获取菜单。
答案 1 :(得分:8)
在您的片段中,您必须使用setHasOptionsMenu(true);才能从片段中访问选项菜单。
代码(在你要隐藏项目的第二个片段中):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO your code to hide item here
super.onCreateOptionsMenu(menu, inflater);
}
同样,对于要显示MenuItem的片段,您可以执行类似的操作。
答案 2 :(得分:4)
在上面添加穆罕默德的答案。将项目设置为不可见后,您可能还需要禁用该项目。请注意Google的评论:“即使菜单项不可见,它仍然可以通过其快捷方式调用(以完全禁用项目,将其设置为不可见和禁用)”在MenuItem文档中的setVisible()下。 因此:
答案 3 :(得分:4)
在要隐藏项目的片段中
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.action_search);
item.setVisible(false);
和你片段的onCreate()
setHasOptionsMenu(true);
答案 4 :(得分:1)
将以下代码添加到您的片段中
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem item = menu.findItem(R.id.save);
item.setVisible(false);
}
答案 5 :(得分:0)
// create Boolean variable in the main activity
private var menuvisibile: Boolean = true
// while navigating fragments set the menuvisibile value and use it
// variable as part of the return statement
invalidateOptionsMenu()
menuvisibile = false
override fun onCreateOptionsMenu(menu: Menu?): Boolean
{
val menuInflater = menuInflater
menuInflater.inflate(R.menu.notification,menu)
return menuvisibile
}
对我来说很好。