Android - 如何隐藏当前片段的菜单选项

时间:2014-11-25 12:07:32

标签: android android-fragments

我有一个带有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);

6 个答案:

答案 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()下。 因此:

  • item.setVisible(假);
  • item.setEnabled(false);

答案 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
    }

对我来说很好。