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

Qua*_*ger 6 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();
      }
Run Code Online (Sandbox Code Playgroud)

有关更改菜单的Google文档说禁用onPrepareOptionsMenu中的菜单 - 但我如何知道选择了哪个项目?

- 已实施决议 -

使用下面的Muhammed Refaat解决方案,我在课程中添加了两个新成员:

private Menu activityMenu;
private MenuItem curMenuItem;
Run Code Online (Sandbox Code Playgroud)

将它们设置在onCreateOptionsMenu中

activityMenu = menu;
curMenuItem = activityMenu.findItem(R.id.action_study);
curMenuItem.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

并在onOptionsItemSelected上更改了它们

curMenuItem.setVisible(true);
curMenuItem = activityMenu.findItem(id);
curMenuItem.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

Muh*_*aat 8

首先获取要删除的项目:

MenuItem item = menu.findItem(R.id.your_action);
Run Code Online (Sandbox Code Playgroud)

然后设置它的可见性false:

item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

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


Atu*_*lic 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);     
}
Run Code Online (Sandbox Code Playgroud)

同样,对于要显示MenuItem的片段,您可以执行类似的操作.


Tus*_*kur 6

在要隐藏项目的片段中

@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem item=menu.findItem(R.id.action_search);
    item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

onCreate()你的片段中

 setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)