Cómo agregar un elemento desplegable en la barra de acciones

82

En mi aplicación Android Honeycomb utilizo Tabs como estilo de navegación. Me gustaría agregar un elemento junto al botón de desbordamiento, pero quiero que ese elemento sea una lista desplegable, y el usuario podrá seleccionar una opción allí, pero no relacionada con la navegación. ¿Cuál es la forma más fácil desde que estoy usandomActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

¿Es posible hacerlo sin usar una vista personalizada?

Paulo Barros
fuente

Respuestas:

221

Primera opción:

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>

Segunda opción:

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" />

Documentos para recursos de menú: http://developer.android.com/guide/topics/resources/menu-resource.html

fhucho
fuente
2
¡Esos submenús son un gran consejo! Me ahorré horas de investigación y trabajo, ¡gracias!
damaxxed
7
¿Cómo respondo a un clic de la ruleta?
gregm
2
Esto no funciona para Android 2.2. La aplicación falla. tienes una solución?
Tobias
3
Use ActionBarSherlock ... no habían introducido ActionBar en Android 2.2 y, por lo tanto, ActionBarSherlock le permite actualizar estas características. actionbarsherlock.com
edwoollard
4
@Sandeep Maram Puede obtener ruleta Spinner spinner = (Spinner)menu.findItem(R.id.menuPeriodType).getActionView()en onCreateOptionsMenu(). Luego configure el elemento de escucha de selección.
Lahiru Chandima
34

Absolutamente la mejor y más simple respuesta que encontré hasta ahora está aquí .

Básicamente, no es necesario un diseño personalizado en este caso. Simplemente configure 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>

Y luego manipúlelo en onCreateOptionsMenu, como de costumbre:

@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); 

Esta es, con mucho, la solución más simple y limpia. Créditos a François Poyer, el autor original.

Alen Siljak
fuente
Probado y aprobado.
Gus Costa
0

Funcionará solo como menú desplegable

<?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>

fragmento interior

setHasOptionsMenu (verdadero)

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


    super.onCreateOptionsMenu(menu, inflater);
}
Srishti Roy
fuente