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

6

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

谷歌有关更改菜单的文档中建议在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);

https://stackoverflow.com/questions/26420204/changing-visibility-of-menu-items-in-fragment/47531110#47531110 - Ashwin H
6个回答

9
首先获取您想要删除的项目:
MenuItem item = menu.findItem(R.id.your_action);

然后将其可见性设置为 false
item.setVisible(false);

如果问题在于获取菜单(因为它不在片段中),你可以轻松地从包含菜单的活动中获取context,并通过它获取菜单。


1
谢谢你,让我找到了正确的方向。我还需要将当前隐藏的项目设置为可见,但这很容易解决。 - QuantumTiger
@QuantumTiger 很好,我很高兴能帮到你 :) - Muhammed Refaat

7
在你的片段中,你需要使用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的片段,你可以做类似的事情。

5
在您想要隐藏物品的片段中
@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem item=menu.findItem(R.id.action_search);
    item.setVisible(false);

在您的片段的onCreate()

 setHasOptionsMenu(true);

4

补充Muhammed上面的回答。一旦将项目设置为不可见,您可能还需要禁用该项目。请注意Google的评论:“即使菜单项不可见,仍可以通过其快捷方式调用它(要完全禁用项目,请在MenuItem文档中的setVisible()下将其设置为不可见和禁用)。”因此:

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

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);
}

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
    }

对我来说运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接