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;
Author by
AMH
Updated on December 19, 2022Comments
-
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