invalidateOptionsMenu doesn't work in fragment

25,164

Solution 1

For updating the onCreateOptionsMenu inside the fragment you need to call the setHasOptionsMenu(true); inside the onCreate method of the fragment. Otherwise you won't be able to update it when you call getActivity().invalidateOptionsMenu();

sample:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

EDIT:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if(seachEditText.getText().toString().length() > 0)
        {
            menu.findItem(R.id.action_search).setVisible(true);
        }
        else
        {
            menu.findItem(R.id.action_search).setVisible(false);
        }
    super.onCreateOptionsMenu(menu, inflater);


}

Solution 2

Try this:

@Override
public boolean onPrepareOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onPrepareOptionsMenu(menu, inflater);
    if (seachEditText.getText().toString().length() > 0) {
        menu.findItem(R.id.action_search).setVisible(true);
    } else {
        menu.findItem(R.id.action_search).setVisible(false);
    }
}

Solution 3

Solution 1

This is work in fragment

 getActivity().invalidateOptionsMenu();

Solution 2

Try this if above code is not working

invalidateOptionsMenu(getActivity());

Import this library

import static androidx.core.app.ActivityCompat.invalidateOptionsMenu;
Share:
25,164
AMH
Author by

AMH

Updated on December 19, 2022

Comments

  • AMH
    AMH over 1 year

    I want to show or hide item in actionbar according to either their is text in the edit text or not

    so I did the following

                public class NounSearch extends  android.app.Fragment 
    {
    
    EditText seachEditText;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                View rootView = inflater.inflate(R.layout.nounsearchactivity, container, false);
                        //Intiate EditText
                seachEditText =(EditText) rootView.findViewById(R.id.nounSearch);
                seachEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                            searchResult.Entities = new ArrayList<NounModel>();
                            _currentPage = 0;
                            categoryId = -1;
                            new GetNouns().execute();
                            return true;
                        }
    
    
                        return false;
                    }
                });
                seachEditText.addTextChangedListener(new TextWatcher() {
    
                   public void afterTextChanged(Editable s) {
                   }
    
                   public void beforeTextChanged(CharSequence s, int start,
                     int count, int after) {
                   }
    
                   public void onTextChanged(CharSequence s, int start,
                     int before, int count) {
                     getActivity().invalidateOptionsMenu();
                   }
                  });
    
        }
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
    
                if(seachEditText.getText().toString().length() > 0)
                {
                    menu.findItem(R.id.action_search).setVisible(true);
                }
                else
                {
                    menu.findItem(R.id.action_search).setVisible(false);
                }
        }
    
    
    
    
    
    }
    

    but the actionitem never appear