82 votes

Comment ajouter un élément de liste déroulante dans la barre d'action ?

Dans mon application Android Honeycomb, j'utilise des onglets comme style de navigation. Je voudrais ajouter un élément à côté du bouton de débordement, mais je veux que cet élément soit une liste déroulante, et que l'utilisateur puisse y sélectionner une option, mais sans rapport avec la navigation. Quel est le moyen le plus simple, puisque j'utilise mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

Est-il possible de le faire sans utiliser une vue personnalisée ?

0 votes

221voto

fhucho Points 8964

Première option :

menu/options.xml :

<item
    android:icon="@drawable/ic_menu_sort"
    android:showAsAction="ifRoom">
    <menu>
        <item
            android:id="@+id/menuSortNewest"
            android:title="Sort by newest" />
        <item
            android:id="@+id/menuSortRating"
            android:title="Sort by rating" />
    </menu>
</item>

Deuxième option :

menu/options.xml :

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuSort"
        android:showAsAction="ifRoom"
        android:actionLayout="@layout/action_sort"  />
</menu>

layout/action_sort.xml :

<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ic_menu_refresh"
    android:entries="@array/order" />

Docs pour les ressources du menu - http://developer.Android.com/guide/topics/resources/menu-resource.html

2 votes

Ces sous-menus sont une excellente astuce ! Ils m'ont épargné des heures de recherche et de travail, merci !

0 votes

Excellente réponse ! En outre, vous pouvez également inclure des icônes dans le sous-menu.

7 votes

Comment répondre à un clic sur le spinner ?

35voto

Alen Siljak Points 307

La meilleure et la plus simple des réponses que j'ai trouvées jusqu'à présent est la suivante aquí .

En fait, il n'est pas nécessaire d'utiliser une mise en page personnalisée dans ce cas. Il suffit de définir l'actonViewClass :

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

  <item android:id="@+id/spinner"
    yourapp:showAsAction="ifRoom"
    yourapp:actionViewClass="android.widget.Spinner" /> <== this is all that's required
</menu>

Et ensuite le gérer dans onCreateOptionsMenu, comme d'habitude :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_layout, menu);
    MenuItem item = menu.findItem(R.id.spinner);
    Spinner spinner = (Spinner) MenuItemCompat.getActionView(item); // get the spinner
    spinner.setAdapter(adapter); 
    spinner.setOnItemSelectedListener(onItemSelectedListener); 

C'est de loin la solution la plus simple et la plus propre. Crédits à François Poyer, l'auteur original.

0voto

Srishti Roy Points 26

Il fonctionnera uniquement en tant que liste déroulante

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!--<item-->
    <!--android:id="@+id/save_contact"-->
    <!--android:icon="@drawable/edit_new"-->
    <!--android:title="Save Contact"-->
    <!--app:showAsAction="never" />-->

    <item
        android:id="@+id/send_money"
        android:icon="@drawable/edit_new"
        android:title="Send Money"
        app:showAsAction="never" />

    <item
        android:id="@+id/request_money"
        android:icon="@drawable/edit_new"
        android:title="Request money"
        app:showAsAction="never" />

    <item
        android:id="@+id/recharge"
        android:icon="@drawable/edit_new"
        android:title="Recharge"
        app:showAsAction="never" />
</menu>

fragment intérieur

setHasOptionsMenu(true)

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.chat_details_menu, menu);

    super.onCreateOptionsMenu(menu, inflater);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X