J'essaie d'avoir un menu d'options dans Android Fragments. Les options du menu ActionBar
ne s'affichent pas dans mes fragments.
Voici mon code et j'ai à la fois la fonction onCreateOptionsMenu()
et onOptionSelected()
. Mon code ne montre aucune erreur. Mais les options ne s'affichent pas.
package org.reachout;
import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.LinearLayout;
import org.general.R;
public class ViewMessageFragment extends Fragment {
/* (non-Javadoc)
* @see Android.support.v4.app.Fragment#onCreateView(Android.view.LayoutInflater, Android.view.ViewGroup, Android.os.Bundle)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
// We have different layouts, and in one of them this
// fragment's containing frame doesn't exist. The fragment
// may still be created from its saved state, but there is
// no reason to try to create its view hierarchy because it
// won't be displayed. Note this is not needed -- we could
// just run the code below, where we would create and return
// the view hierarchy; it would just never be used.
return null;
}
return (LinearLayout)inflater.inflate(R.layout.viewmessages_tab_fragment_layout, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.askexperts_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// handle item selection
switch (item.getItemId()) {
case R.id.action_settings:
// do s.th.
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Vous devez appeler setHasOptionsMenu(true)
dans onCreate()
.
Pour la compatibilité ascendante, il est préférable de placer cet appel le plus tard possible à la fin de onCreate()
ou même ultérieurement dans onActivityCreated()
ou quelque chose du genre.
Voir: https://developer.Android.com/reference/Android/app/Fragment.html#setHasOptionsMenu (boolean)
Je suis en retard pour la réponse mais je pense que ceci est une autre solution qui n'est pas mentionnée ici donc poster.
Étape 1: Créez un xml de menu que vous souhaitez ajouter, comme je dois ajouter une action de filtrage sur ma barre d’action pour créer un xml filter.xml. La ligne principale à noter est Android: orderInCategory Ceci affichera l’icône d’action en premier ou en dernier, quel que soit l'endroit où vous souhaitez le montrer. Une dernière chose à noter est la valeur. Si la valeur est inférieure à celle indiquée, elle sera affichée en premier et si la valeur est supérieure, elle sera affichée en dernier.
filter.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" >
<item
Android:id="@+id/action_filter"
Android:title="@string/filter"
Android:orderInCategory="10"
Android:icon="@drawable/filter"
app:showAsAction="ifRoom" />
</menu>
Étape 2: Dans onCreate () la méthode de fragment vient de mettre la ligne ci-dessous, comme mentionné, qui est chargée de rappeler onCreateOptionsMenu (Menu Menu, MenuInflater inflater) méthode comme dans un Activité.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
Étape 3: Maintenant ajoutez la méthode onCreateOptionsMen qui sera remplacée par:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.filter, menu); // Use filter.xml from step 1
}
Étape 4: Maintenant, ajoutez onOptionsItemSelected méthode permettant d'implémenter la logique de votre choix lorsque vous sélectionnez l'icône d'action ajoutée dans actionBar:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_filter){
//Do whatever you want to do
return true;
}
return super.onOptionsItemSelected(item);
}