Cómo agregar un elemento desplegable en la barra de acción
Pregunta
En mi aplicación Android Honeycombo uso pestañas como estilo de navegación. Me gustaría agregar un elemento al lado del botón de desbordamiento, pero quiero que ese elemento sea una lista desplegable, y el usuario podrá seleccionar una opción allí, pero no está relacionado con la navegación. ¿Cuál es la forma más fácil desde que estoy usando mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
¿Es posible hacerlo sin usar una vista personalizada?
Solución
Primera opción:
menú/opciones.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:
menú/opciones.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>
diseño/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
Otros consejos
Absolutamente la mejor y la respuesta más simple que encontré hasta ahora es aquí.
Básicamente, no hay necesidad de diseño personalizado en este caso. Acabo de configurar el 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 manejarlo en OnCreateePtionsMenu, 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.
Funcionará solo como 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);
}