Android – Cómo acceder a los elementos de menú de la barra de acciones en la clase de fragmento

¿Cómo debo acceder a los elementos de menú de la barra de acciones en fragmento? Lo he intentado pero no ha sucedido nada

@Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.menu_refresh: Toast.makeText(getActivity().getApplicationContext(), "clicked", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu, inflater); } 

Sigue estos pasos:

  • Agregue el método setHasOptionsMenu (true) en su Fragmento.

  • Anule los métodos onCreateOptionsMenu (Menú de menú, Inflamación MenuInflater) y onOptionsItemSelected (Elemento MenuItem) en su Fragmento.

  • Dentro de su método onOptionsItemSelected (item MenuItem) Activity, asegúrese de devolver false cuando la acción de elemento de menú se implementaría en el método onOptionsItemSelected (item MenuItem) Fragment.

Ejemplo:

Actividad

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; } 

Fragmento

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; } 

En tus fragmentos onCreate método add setHasOptionsMenu(true); .

Si su fragmento está en un ViewPager, el fragmento con ViewPager también necesita la línea anterior.

No puedes acceder directamente a los elementos del menú ActionBar en un fragmento. Lo que puedes hacer es poner setHasOptionsMenu (true); En la función onCreateView en la clase fragment y esto llama a la función onCreateOptionsMenu (menú Menú) en la actividad correspondiente.

Allí, puede acceder a todos los elementos de menú que tiene en la barra de acción. Puedes usar:

 MenuItem item = menu.getItem(index); 

Usted tiene un ejemplo de usar esto:

En el fragmento de la clase onCreateView:

 setHasOptionsMenu(true); 

En la clase de actividad correspondiente:

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); MenuItem item = menu.getItem(0); if(condition) item.setVisible(true); else item.setVisible(false); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle action bar actions click switch (item.getItemId()) { case R.id.action_logout: makeLogout(); return true; default : return super.onOptionsItemSelected(item); } } 

Una cosa que añadir a esto (mi reputación no me permite comentar) y la razón no funcionaba para mí.

Asegúrese de que la actividad de alojamiento de su fragmento extiende AppCompatActivity no FragmentActivity !

 public class MainActivity extends AppCompatActivity { } 

De la documentación de referencia de Google para FragmentActivity:

Nota: Si desea implementar una actividad que incluya una barra de acción, debe utilizar la clase ActionBarActivity, que es una subclase de ésta, por lo que le permite utilizar Fragment APIs en API de nivel 7 y superior.

ActionBarActivity ahora está en desuso, utilice AppCompatActivity en AppCompatActivity lugar. Al usar AppCompatActivity , también asegúrese de establecer "el tema de la actividad Theme.AppCompat o un tema similar" (Google Doc también).

android.support.v7.app.AppCompatActivity es una subclase de la clase android.support.v4.app.FragmentActivity (consulte AppCompatActivity ref doc).

Elemento de menú archivo main.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="dbl.contact.manager.MainActivity" > <item android:id="@+id/menu_search" android:actionLayout="@layout/action_bar" android:icon="@drawable/searchagain" android:orderInCategory="0" android:showAsAction="always" android:title="search"/> </menu> 

Este es el elemento de menú. Barra de acción personalizada como edittext en la barra de acción Tienes que crear un diseño personalizado. Aquí el archivo action_bar.xml personalizado:

 <?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/inputSearch" android:layout_width="280dp" android:layout_height="40dp" android:cursorVisible="true" android:hint="Search" android:imeOptions="actionDone" android:inputType="text" android:textColor="@android:color/white" android:textCursorDrawable="@android:color/white" /> 

A continuación, en la clase de fragmentos de anular. Sólo copie y pegue este código.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Add your menu entries here super.onCreateOptionsMenu(menu, inflater); getActivity().getMenuInflater().inflate(R.menu.main, menu); View v = (View) menu.findItem(R.id.menu_search).getActionView(); inputSearch = (EditText)v.findViewById(R.id.inputSearch); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub // clientAdapter.getFilter().filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub // ListData.this.clientAdapter.getFilter().filter(s); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub adapter.getFilter().filter(s.toString()); } }); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.