web-dev-qa-db-fra.com

android getMenuInflater () dans une sous-classe de fragment - ne peut pas résoudre la méthode

J'essaie de gonfler un menu dans une classe qui hérite de la classe Fragment. Voici ma méthode OnCreateOptionsMenu() -

@Override
public boolean OnCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.forecastfragment, menu) ;
    return true;
}

Cela soulève l'erreur suivante:

Impossible de résoudre la méthode 'getMenuInflater ()'

J'ai essayé :

MenuInflater inflater = getActivity().getMenuInflater();

mais alors Android Studio met en surbrillance @Override en rouge et indique:

La méthode ne remplace pas la méthode de sa superclasse

J'ai également essayé de créer une méthode getMenuInflater dans la même classe et de la renvoyer new MenuInflater(this)

public MenuInflater getMenuInflater() {
    return new MenuInflater(this);
}

mais alors l'erreur suivante est levée:

erreur: types incompatibles: ForecastFragment ne peut pas être converti en contexte

erreur: la méthode ne remplace pas ou n'implémente pas une méthode à partir d'un supertype

Que fais-je?

13
Flame of udun

La signature de votre onCreateOptionsMenu ne semble pas correcte. Jetez un œil aux documents ici

Jetez un oeil à ce code

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);//Make sure you have this line of code.
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
}
13
Zain

Dans votre classe de fragments, ajoutez:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.[IDMENU], menu) ;
}

Où [IDMENU] est le nom XML de votre menu.

Ensuite, vous devez ajouter à l'intérieur de la méthode onCreate ou onCreateView ceci:

setHasOptionsMenu(true);
2
Marco Concas

Utilisez ce code:

@Override
public boolean OnCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.forecastfragment, menu) ;
    final MenuItem item = menu.findItem(R.id.forecastID);
}

où prévisionID est l'ID de l'élément dans le menu forcastfragment.xml. Ajoutez également setHasOptionsMenu(true); dans votre OnCreateView() pour que le fragment appelle la méthode.

En parallèle, il est de pratique courante d'inclure le mot "menu" dans les noms de fichiers de votre menu tels que "Forecastfragment_menu.xml". Cela évite la confusion.

1
McGuile
  • Selon API pas overriding a super méthode.
  • Vous n'appelez pas la bonne méthode inflate.

Vous devez l'utiliser de cette manière:

@Override
public boolean OnCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.forecastfragment, menu);
    return true;
}
1
Jordi Castilla