web-dev-qa-db-fra.com

Élément avec application: showAsAction ne s'affiche pas

Je ne comprends pas pourquoi le code est incorrect et incompatible (AndroidStudio me dit "Doit utiliser app: showAsAction avec la bibliothèque appcompat)

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:id="@+id/action_search"
      Android:title="@string/action_search"
      Android:icon="@drawable/search"
      Android:showAsAction="always" />
</menu>

fonctionne parfaitement, mais la version appropriée et compatible comme

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:app="http://schemas.Android.com/apk/res-auto" >
    <item Android:id="@+id/action_search"
          Android:title="@string/action_search"
          Android:icon="@drawable/search"
          app:showAsAction="always" />
</menu>

ne montrant pas du tout mon icône.

Je teste sur Samsung GT P5210 (Android v. 4.4.2) et Nexus 7 (4.4.4)

30
ITurchenko

Les choses que vous devez toujours vérifier lorsque vous souhaitez utiliser la barre d'actions sont

1) Étendez ActionBarActivity au lieu de Activity

public class MainMenu extends ActionBarActivity{

2) Faites choisir le style droit comme défini au manifeste

Manifest

<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >

Style

    <style name="AppTheme"
    parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

3) Sélectionnez titre de droite pour showAsAction

  <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:**yourapp**="http://schemas.Android.com/apk/res-auto" >
  <item Android:id="@+id/action_search"
      Android:icon="@drawable/ic_action_search"
      Android:title="@string/action_search"
      **yourapp**:showAsAction="ifRoom"  />
    ...
  </menu>

C'est ce que la plupart des gens se trompent

4) Définissez votre Menu dans Activity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

Si vous faites tout ce qui suit, votre barre d'action devrait fonctionner.

Ensuite, vous devez ajouter le onClickListener pour chaque position ...

56
marduc812

Je viens de relire votre question et j'ai vu que votre problème est tout le contraire (mais certaines parties de mon ancienne réponse s'appliquent toujours à votre problème), voici donc la réponse mise à jour:

Mise à jour:

Vous avez importé la bibliothèque appcompat dans votre fichier Gradle, mais vous semblez ne prendre en charge que les périphériques plus récents que l'API niveau 11 ou 14? Si tel est le cas, la vérification des peluches constate que vous avez importé la bibliothèque appcompat via gradle et pense que vous devez utiliser le ActionBarActivity en raison de l'importation de votre bibliothèque. C'est pourquoi vous obtenez l'erreur. Mais comme votre attribut Android:showAsAction Fonctionne, vous utilisez le Activity natif et l'appel d'attribut natif est correct, même si la vérification des peluches indique qu'il est incorrect. Donc, si vous souhaitez supprimer l'erreur de peluche, vous devez supprimer la bibliothèque appcompat de votre fichier gradle et peut-être changer votre thème d'activité en thème Holo Light natif, car votre thème actuel peut s'appuyer sur le thème appcompat.

La raison pour laquelle cela ne fonctionne pas avec l'espace de noms app se trouve dans le chargement d'attribut XML pour le code de bibliothèque respectivement natif, qui était géré dans l'ancienne réponse.

Ancienne réponse

Si vous utilisez le ActionBarActivity de la bibliothèque de support pour atteindre les appareils inférieurs au niveau d'API 11, le problème principal ici est que le ActionBarActivity recrée une partie du Android Attributs XML tels que Android:showAsAction Dans sa propre portée, que vous définissez avec:

xmlns:app="http://schemas.Android.com/apk/res-auto"

puis accédez-y avec le même attribut (ici showAsAction) dans l'espace de noms app:. Ainsi, ActionBarActivity ne peut pas voir ou atteindre l'attribut natif Android:showAsAction Car il le recherche uniquement dans l'espace de noms app et non dans l'espace de noms Android.

Si vous souhaitez utiliser l'attribut natif, vous devez utiliser le Activity natif avec un thème Holo, qui n'est pris en charge qu'à partir de l'API niveau 11 et supérieur.

16
blackfizz

ajoutez ceci:

yourapp:showAsAction="ifRoom"

ou

Android:showAsAction

par exemple:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
    <item Android:id="@+id/action_search"
          Android:icon="@drawable/ic_action_search"
          Android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />

</menu>

et dans l'activité:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_compose:
            composeMessage();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Et en savoir plus ici

4
MilanNz