android - item - oncreateoptionsmenu fragment
Ocultar MenuItem en algunos fragmentos (8)
Estoy usando un menú que tiene más Fragment
. En algunos Fragment
tengo el elemento de menú REFRESH, pero en algunos fragmentos quiero ocultar este elemento del menú (no quiero mostrar el menú, pero no quiero ocultar la ActionBar
).
Intento agregar omitir onCreateOptionsMenu()
a Fragment
donde no quiero mostrar este elemento de menú pero no puedo hacer que funcione. Intento de muchas maneras ver la línea comentada en el código. ¿Alguna idea de dónde está el problema? Y por último, este elemento del menú se esconde cuando activo el menú desplegable cuando se llama onPrepareOptionsMenu()
en MainActivity, pero necesito hacerlo cuando estoy en Fragment
.
Fragment
donde quiero ocultar el elemento del menú REFRESH:
public class FindPeopleFragment extends Fragment {
public FindPeopleFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
//setHasOptionsMenu(false);
return rootView;
}
private Menu menu=null;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.main, menu);
this.menu=menu;
menu.findItem(R.id.refresh).setVisible(false);
getActivity().invalidateOptionsMenu();
//setHasOptionsMenu(false);
super.onCreateOptionsMenu(menu,inflater);
}
}
MainActivity donde se define MENU DRAWER:
//Slide menu item click listener
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.refresh:
Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
// Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.refresh).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
Acabo de utilizar el código siguiente para ocultar menuitem en fragmnet donde no quiero usarlo. Nota: Por favor lea el comentario
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment
String shareVisible=whichFragment.getClass().toString();
if(shareVisible.equals(AccFragment.class.toString())
||shareVisible.equals(SocFragment.class.toString())
||shareVisible.equals(DevFragment.class.toString())
){
MenuItem item=menu.findItem(R.id.action_share);
item.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
En el Fragment
donde no quiere mostrar ninguna opción de menú, necesita setHasOptionsMenu(false);
en onCreate()
, así:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(false);
}
Sin embargo, el menú que se muestra que desea ocultar (REFRESH) pertenece a MainActivity. Es por eso que siempre se muestra. Como desea controlar el menú en el nivel de Fragment
(y no mostrar un menú de opciones de Activity
), mi sugerencia es eliminar el código de menú de la Activity
e implementarlo en su Fragment
.
Activity
y los Fragment
pueden tener sus propios menús por separado. Ver este link
En el fragmento donde quieres ocultar el elemento
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.action_search);
item.setVisible(false);
y en onCreate () de tu fragmento
setHasOptionsMenu(true);
Hay muchas versiones diferentes de soluciones similares, pero desafortunadamente, ninguna de ellas funcionó para mí. Estoy compartiendo lo que finalmente fue útil para mí para ocultar todo el menú de desbordamiento con múltiples elementos de menú. Pensé que tal vez sea útil para cualquiera.
Agrupé mis menús con una id
y luego referí esa id
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.menu_overflow, false);
super.onPrepareOptionsMenu(menu);
}
Si desea ocultar un elemento de menú individual, puede usar
menu.getItem(R.id.action_licenses).setVisible(false);
Lo importante es que debe tener setOptionsMenu(true)
en onViewCreated()
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
O resuélvelo en el mismo Fragmento que creó el menú, si aloja la barra de acciones en el nivel de actividad. De esta forma, no tiene que agregarlo en ningún otro Fragmento donde no desee mostrarlo:
public override void OnDestroy()
{
base.OnDestroy();
HasOptionsMenu = false;
}
Simplemente encuentre el artículo que desea ocultar utilizando findItem
luego configure su visibilidad en false
.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.action_settings);
item.setVisible(false);
}
por favor prueba esto
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.clear();
}
y pon esto en tu fragmen onCreate ()
setHasOptionsMenu(true);
En la clase de fragmento
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
}