web-dev-qa-db-fra.com

Barre d'outils AppCompat_v7 en tant que barre d'actions ne montrant pas les actions «toujours» du menu, mais la barre d'outils API ne

Après 2 jours de difficultés avec la nouvelle barre d'outils API 21 et appCompat_v7, je pense avoir trouvé un bug dessus. Si vous avez 2 actions sur votre menu comme ceci:

<item
    Android:id="@+id/action_test"
    Android:showAsAction="always"
    Android:icon="@drawable/ic_launcher"
    Android:title="@string/action_settings"/>

<item
    Android:id="@+id/action_settings"
    Android:orderInCategory="100"
    Android:showAsAction="never"
    Android:title="@string/action_settings"/>

et une barre d'outils appCompat définie comme ceci:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.toolbar.MainActivity" >

    <Android.support.v7.widget.Toolbar 
        Android:layout_width="match_parent"
        Android:layout_height="52dp"
        Android:id="@+id/toolbar">
    </Android.support.v7.widget.Toolbar>

</RelativeLayout>

après gonflage (ou définition de la méthode setSupportActionBar)

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
toolbar.setTitle("esurance");
setSupportActionBar(toolbar);

vous obtiendrez le menu de la barre d'outils sans votre icône d'action, il l'affichera dans le menu de débordement.

Mais, si vous utilisez la classe Toolbar d'API 21, elle affichera vos actions telles que définies dans la disposition de votre menu ...

<Toolbar 
    Android:layout_width="match_parent"
    Android:layout_height="52dp"
    Android:id="@+id/toolbar">
</Toolbar>

Peut-être que je manque quelque chose ici, mais jusqu'à présent, je n'ai pas pu afficher les actions en dehors du menu de débordement en utilisant appCompat. Toute aide à ce sujet sera très appréciée.

enter image description here

34
Roisgoen

Par formation Action Bar , vous devez utiliser le app:showAsAction attributs plutôt que Android:showAsAction attribut:

Notez que l'attribut showAsAction ci-dessus utilise un espace de noms personnalisé défini dans le <menu> tag. Cela est nécessaire lorsque vous utilisez des attributs XML définis par la bibliothèque de support, car ces attributs n'existent pas dans le cadre Android sur les appareils plus anciens. Vous devez donc utiliser votre propre espace de noms comme préfixe pour tous les attributs défini par la bibliothèque de support.

Votre fichier de menu devrait donc ressembler à:

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

    <item
        Android:id="@+id/action_settings"
        Android:orderInCategory="100"
        app:showAsAction="never"
        Android:title="@string/action_settings"/>
</menu>
77
ianhanniballake

utilisez d'abord le app:showAsAction au lieu de Android:showAsAction (comme @ianhanniballake) après cela dans onCreateActionMode après avoir gonflé votre menu setShowAsAction dans un code comme celui-ci

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.your_menu_name, menu);
menu.findItem(R.id.your_first_menu_id).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.findItem(R.id.your_second_menu_id).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
} 

j'ai eu le même problème, donc après y avoir travaillé, ces lignes de code fonctionnent bien pour moi.

3
ShahinFasihi

mettre

xmlns: app = "http://schemas.Android.com/apk/res-auto" int votre balise de menu

comme ça

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

puis utilisez app:showAsAction = "always"

N'oubliez pas que utilisez app:showAsAction dans tous les éléments de menu pas Android:showAsAction

"

3
Singhak