Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - How to hide menu option for current fragment

I have an ActionBar activity with a FrameLayout and a menu. when the user clicks the menu item I replace the fragment with the relevant new fragment. However, I cannot see an obvious way to remove the menu item for the selected fragment.

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

The Google documentation on changing menus says to disable the menu in onPrepareOptionsMenu - but how will I know which item has been selected?

--Solution Implemented--

Using Muhammed Refaat's solution below I added two new members to the class:

private Menu activityMenu;
private MenuItem curMenuItem;

Set them in onCreateOptionsMenu

activityMenu = menu;
curMenuItem = activityMenu.findItem(R.id.action_study);
curMenuItem.setVisible(false);

And changed them on onOptionsItemSelected

curMenuItem.setVisible(true);
curMenuItem = activityMenu.findItem(id);
curMenuItem.setVisible(false);
like image 816
QuantumTiger Avatar asked Nov 25 '14 12:11

QuantumTiger


2 Answers

First get the item you want to remove :

MenuItem item = menu.findItem(R.id.your_action);

then set it's Visibility false :

item.setVisible(false);

and if the problem is in getting the menu (as it's not in the fragment), you can easily get a context from the activity that contains the menu and get the menu by it.

like image 63
Muhammed Refaat Avatar answered Oct 05 '22 05:10

Muhammed Refaat


Inside your fragment you will have to use setHasOptionsMenu(true); in order to access options menu from within your fragment.

Code (inside your second fragment where you wanna hide the item):

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

Similarly, for your fragment where you want to show that MenuItem you can do the similar thing.

like image 22
Atul O Holic Avatar answered Oct 05 '22 03:10

Atul O Holic