not item first developer android android-layout android-spinner android-toolbar

item - spinner android developer



¿Cómo puedo arreglar el estilo de Spinner para Android 4.x colocado en la barra de herramientas? (15)

De acuerdo con la documentación de Android , el estilo Material Design es compatible con el widget Spinner.

Así que decidí usarlo en mi aplicación colocándolo en la parte superior de la barra de herramientas.

layout / activity_base.xml

<android.support.v7.widget.Toolbar android:id="@+id/my_awesome_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="5dp" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.v7.widget.Toolbar>

Tema de actividad

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/omni_primary_color</item> <item name="colorPrimaryDark">@color/omni_primary_color_dark</item> <item name="colorAccent">@color/omni_accent_color</item> </style>

BaseActivity.java

public class BaseActivity extends ActionBarActivity { @InjectView(R.id.my_awesome_toolbar) Toolbar mToolbar; @InjectView(R.id.spinner) Spinner spinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_base); ButterKnife.inject(this); //setup toolbar setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); mToolbar.setNavigationIcon(R.drawable.ic_action_navigation_menu); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mToolbar.getContext(), R.array.planets_array, R.layout.support_simple_spinner_dropdown_item); adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); spinner.setAdapter(adapter); } }

En Lollipop spinner y desplegable se ve bien, aunque el color de fondo desplegable es negro en comparación con menú desplegable que es blanco. Supongo que esa app:popupTheme="@style/ThemeOverlay.AppCompat.Light" no se propaga al spinner.

Android 5.0

Ahora, el gran problema es con Android 4.x, donde el color de fondo desplegable es blanco (¿PopupTheme propagated?) Y el ícono al lado del spinner es negro.

Android 4.4

¿Cómo puedo configurarlo correctamente en XML o implementarlo en el código para que funcione en Android 5 y 4? Idealmente, me gustaría tener ambas apariencias en Android 5 pero con un menú desplegable blanco (como menú desplegable Configuración).

Actualizar

Me di cuenta de que la configuración de la propiedad colorControlNormal afecta el ícono de filtro de la colorControlNormal giratoria. Si alguien descubre cómo usar eso para Spinner (sin cambiar otros controles de contenido), entonces tendría mi solución combinando ese hallazgo con la respuesta @Sven.

Actualizar

El siguiente cambio corrige el problema del texto del panel giratorio y el color emergente. Entonces, el único problema para la solución final es el ícono del filtro.

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(), R.array.planets_array, R.layout.support_simple_spinner_dropdown_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Actualizar

Descubrí que el ícono de filtro es en realidad una parte de android:background especificado para la ruleta y es transparente. Proporcionar sus propios antecedentes lo solucionaría, por ejemplo

<item name="android:background">?android:selectableItemBackground</item>

¡Misterio resuelto!

La última pieza del rompecabezas es la ventana emergente en Android 5 que tiene fondo negro y texto en blanco, pero supongo que se puede resolver con un diseño personalizado. Si nadie proporciona una respuesta completa, lo haré yo mismo y marcaré como aceptado.


¿No puedes hacer esto?

Archivo xml personalizado para el elemento spinner: your_spinner.xml:

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#000" android:background="#FFF" />

Úselo para mostrar los elementos del girador:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.your_spinner,list);

A continuación, elimine el recurso desplegable.


Cuando utilicé spinner se estrelló (Android 2.3.3 - 2.3.7).

Así que intento usar TintSpinner ahora que no está fallando. Inténtalo como una solución opcional

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.internal.widget.TintSpinner android:id="@+id/toolbar_spinner" style="@style/HeaderBar.Spinner" android:layout_width="wrap_content" android:layout_height="match_parent"/> </LinearLayout>

Y usa el código a continuación para enviar tu barra de herramientas

View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner, toolbarTop, false); ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); toolbarTop.addView(spinnerContainer, lp); ToolBarSpinnerAdapter spinnerAdapter = new ToolBarSpinnerAdapter(getLayoutInflater()); String[] items = getResources().getStringArray(R.array.action_dropdown); spinnerAdapter.addItems(items); TintSpinner mNavigationSpinner = (TintSpinner) spinnerContainer.findViewById(R.id.toolbar_spinner); mNavigationSpinner.setAdapter(spinnerAdapter);


Disculpa mi pobre ingles. :) Creo que es mejor crear directamente el spinner en la barra de herramientas.

Aquí hay un ejemplo en mi fragmento.

public class Testfragment1 extends Fragment { Toolbar mToolbar; Spinner mSpinner; ..... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ....... mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); //you can also set the style with the constructor mSpinner = new Spinner(getActivity()); String[] frags = new String[]{ "category1", "category2", "category3", }; ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,frags); mSpinner.setAdapter(arrayAdapter); mToolbar.addView(mSpinner); return inflater.inflate(R.layout.fragment_testfragment1, container, false); } ......... @Override public void onDestroyView() { super.onDestroyView(); if (mToolbar != null && mSpinner != null) { mToolbar.removeView(mSpinner); } } }

Se ve bien en mi android-4.1-device: android-4.1-spinner


Estoy luchando con exactamente el mismo problema.

Intenta cambiar el recurso de vista desplegable. Al menos, esto solucionó el problema del color del texto, sin embargo, el color del icono de la flecha aún está oscuro. Entonces esto es solo una solución parcial.

setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);


He perdido horas en este tema. Por lo que puedo decir, todas las soluciones anteriores requieren copiar / pegar grandes trozos de código de estilo de aplicación para volver a implementar detalles básicos como estados táctiles.

Una forma relativamente fácil de obtener un comportamiento similar al nativo es inflar la vista mediante programación para garantizar que obtiene el tema correcto, por ejemplo:

// Activity has context with ''Theme.AppCompat.Light.NoActionBar'' spinner = new AppCompatSpinner(getActivity()); toolbar.addView(spinner);

Para que el triángulo sea blanco en vez de colorControlNormal , he aplicado un tinte ColorStateList al fondo:

ViewCompat.setBackgroundTintList(spinner, resources.getColorStateList(R.drawable.bg_toolbar_spinner)

bg_toolbar_spinner.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/accent" android:state_pressed="true"/> <item android:color="@android:color/white"/> </selector>


Lo resolví creando nuevos valores para la versión 21 y 23 y agregando un nuevo atributo en el estilo spinner android: dropDownVerticalOffset y eliminándolo del archivo de estilo predeterminado. (mi caso no está relacionado con la barra de herramientas) es para spinner normal.

Agregue este estilo en las carpetas 23 y 21

<style name="spinner_style"> <item name="android:background">@drawable/background_spinner</item> <item name="android:dropDownVerticalOffset">30dip</item> </style>

Funciona perfectamente en todas las versiones. Espero que esto funcione contigo.


No implemente Spinner en Xml

final ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(), R.array.main_navigation_list, R.layout.spinner_text); spinnerAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item); mNavigationTags = getResources().getStringArray(R.array.main_navigation_list); mNavigationSpinner = new Spinner(getSupportActionBar().getThemedContext()); mNavigationSpinner.setAdapter(spinnerAdapter); mNavigationSpinner.setOnItemSelectedListener(this); mToolbar.addView(mNavigationSpinner);

De esta forma, el ícono al lado de la ruleta será blanco


Para el correcto teñido del icono de Spinner, también puedes inflar el rotador desde el código:

spinner_toolbar.xml:

<?xml version="1.0" encoding="utf-8"?> <Spinner xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spinner_toolbar" android:layout_width="wrap_content" android:layout_height="match_parent"/>

Luego debes adjuntar el Spinner a la Barra de Herramientas en tu Actividad:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(), R.array.planets_array, R.layout.support_simple_spinner_dropdown_item); adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); spinner.setAdapter(adapter); // we inflate the spinner with the themed Toolbar context -> correct icon tinting LayoutInflater.from(getSupportActionBar().getThemedContext()).inflate(R.layout.spinner_toolbar, tb, true); Spinner spinner = (Spinner) toolbar.findViewById(R.id.spinner_toolbar); spinner.setAdapter(adapter);

Sin embargo, esto utiliza la aplicación: tema en lugar de la aplicación: popupTheme para todo el Spinner, incluido el menú desplegable. Por lo tanto, el ícono y el texto de Spinner se colorearán correctamente, pero el menú desplegable también tiene el estilo de la barra de herramientas y no del popupTheme.

Por lo tanto, si desea tener una barra de herramientas oscura y un menú desplegable de luz, deberá arreglar el estilo desplegable de alguna manera, por ejemplo, creando un estilo personalizado para el selector que especifique un fondo blanco y una vista desplegable personalizada con un color de texto oscuro .

Tal vez alguien más tenga una mejor solución sobre cómo la aplicación: popupTheme se puede propagar al menú desplegable de Spinner.


Para retomar esto, estaba teniendo problemas similares. Mi problema principal era que el texto en mi barra de herramientas era más pequeño que las dimensiones usuales del título y el color incorrecto. Captura de pantalla aquí http://s27.postimg.org/v24x1aw43/Screen_Shot_2015_01_11_at_13_36_04.png

El menú desplegable estaba bien, pero voy a ir a través de la personalización de eso también.

Permítanme también dejar en claro que esta solución se basa principalmente en la solución de @Daniel B, sin embargo, no requiere el adaptador personalizado, por lo que puedo decir, nada está roto, pero no doy ninguna garantía.

  1. Agregue un elemento giratorio normal en el archivo de diseño XML (dentro de la barra de herramientas).

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="5dp" android:minHeight="?attr/actionBarSize" android:background="@color/colorPrimary" app:theme="@style/GalaxyZooThemeToolbarDarkOverflow" app:popupTheme="@style/Theme.AppCompat" > <Spinner android:id="@+id/spinner_nav" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.v7.widget.Toolbar>

  1. Crear un nuevo archivo de diseño toolbar_spinner_item_actionbar.xml (Esta será la información que se muestra para el giro en la barra de herramientas)

<?xml version="1.0" encoding="utf-8"?> <TextView android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawablePadding="20dp" android:fontFamily="sans-serif" android:paddingLeft="@dimen/abc_action_bar_default_padding_material" android:paddingRight="4dp" android:textColor="@color/colorDark" android:textSize="@dimen/abc_text_size_title_material_toolbar" xmlns:android="http://schemas.android.com/apk/res/android"/> <!-- android:drawableRight="@drawable/spinner_triangle" -->

  1. El adaptador para su spinner sigue siendo prácticamente el mismo, sin embargo, cambie el diseño del estándar android.R.layout.simple_spinner_dropdown_item a R.layout.toolbar_spinner_item_actionbar. Esto aplicará su apariencia personalizada para el texto de la barra de herramientas.

En este ejemplo, configuré el adaptador.setDropDownViewResource en android.R.layout.simple_spinner_dropdown_item, esto aplica los valores predeterminados del tema estándar para la lista desplegable, lo que me satisface.

ArrayAdapter<String> set1Adapter = new ArrayAdapter<String>(RoutineDetailsActivity.this, R.layout.toolbar_spinner_item_actionbar, set1Actual); set1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mWeekSpinner.setAdapter(set1Adapter);

Eso es básicamente, resultado aquí [no se puede adjuntar imagen o agregar otro enlace ya que mi representante es demasiado bajo! Se agregará en el comentario]. Puede detenerse aquí, pero es posible que desee cambiar el color de la flecha desplegable.

Técnicamente, es el tinte correcto para mi aplicación, sin embargo, como mi color primario ya es el color de la barra de herramientas, tendría sentido personalizar la flecha.

Configurar flecha personalizada dibujable

  1. Agregue esta línea dibujable de línea ''android: drawableRight = "@ drawable / spinner_triangle'' en la barra de herramientas_spinner_item_actionbar.xml hecha anteriormente. Ahora bien, esta podría ser cualquier imagen, por ahora podría usar el recurso de flecha blanca de Daniel B aquí here .

Ejecutar esto dará como resultado dos flechas, la flecha blanca y el tema predeterminado. Para resolver esto, agrega el estilo a continuación. De nuevo, esto se extrae del código de Daniel B y probablemente podría ser abreviado, pero por ahora funciona ...

<style name="Widget.MyApp.HeaderBar.Spinner" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar"> <item name="android:background">?android:selectableItemBackground</item> <item name="android:dropDownSelector">?android:selectableItemBackground</item> <item name="android:divider">@null</item> <item name="android:overlapAnchor">true</item> </style>

  1. Aplica el estilo creado al girador ...

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="5dp" android:minHeight="?attr/actionBarSize" android:background="@color/colorPrimary" app:theme="@style/GalaxyZooThemeToolbarDarkOverflow" app:popupTheme="@style/Theme.AppCompat" > <Spinner android:id="@+id/spinner_nav" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/Widget.MyApp.HeaderBar.Spinner"/> </android.support.v7.widget.Toolbar>

El resultado será algo como esto [de nuevo no se puede adjuntar o vincular, se agregará al comentario]. El relleno se puede configurar desde la configuración del archivo anterior, en mi caso necesitaría cambiar la flecha para que coincida con los iconos.

Espero que tenga algún tipo de sentido.


Pasé dos días sobre este problema, pero ahora después de leer muchas respuestas, puedo publicar mi solución. Implementé dos diseños personalizados para el elemento giratorio y la ventana emergente. Configurando este atributo para spinner: android:background="?android:selectableItemBackground" la flecha negra predeterminada del spinner está oculta y podemos usar lo que prefiramos. Usé el método setDropDownVerticalOffset (int) para administrar la posición emergente en las versiones previas de Lollipop para Android.

El tema global de mi aplicación es

<style name="AppTheme" parent="AppTheme.Base"> </style> <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> <item name="android:windowBackground">@color/window_background</item> </style>

Ahora, el diseño de la actividad que contiene la barra de herramientas y el spinner:

activity_main.xml

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:elevation="4dp" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" > <Spinner android:id="@+id/spinner_rss" android:layout_width="wrap_content" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Light" android:background="?android:selectableItemBackground" /> </android.support.v7.widget.Toolbar> </RelativeLayout>

custom_spinner_toolbar.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/spinner_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:textColor="@android:color/white" android:textAppearance="@style/TextAppearance.AppCompat.Title" /> <ImageView android:contentDescription="@string/content_description_arrow_dropdown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/spinner_item_text" android:layout_toEndOf="@+id/spinner_item_text" android:paddingTop="6dp" android:src="@drawable/ic_arrow_drop_down_white_24dp" /> </RelativeLayout>

custom_spinner_dropdown_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <CheckedTextView android:id="@+id/spinner_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:singleLine="true" android:textColor="@android:color/black" android:textSize="16sp" /> </LinearLayout>

SpinnerAdapter.java

public class SpinnerAdapter extends BaseAdapter { private Context mContext; private List<String> mValuesList; public SpinnerAdapter(Context mContext, List<String> mValuesList) { this.mContext = mContext; this.mValuesList = mValuesList; } @Override public int getCount() { return mValuesList.size(); } @Override public Object getItem(int position) { return mValuesList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getDropDownView(int position, View view, ViewGroup parent) { if (view == null || !view.getTag().toString().equals("DROPDOWN")) { LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.inflate(R.layout.custom_spinner_dropdown_item, parent, false); view.setTag("DROPDOWN"); } TextView textView = (TextView) view.findViewById(R.id.spinner_item_text); textView.setText(getTitle(position)); return view; } @Override public View getView(int position, View view, ViewGroup parent) { if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) { LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.inflate(R.layout.custom_spinner_toolbar, parent, false); view.setTag("NON_DROPDOWN"); } TextView textView = (TextView) view.findViewById(R.id.spinner_item_text); textView.setText(getTitle(position)); return view; } private String getTitle(int position) { return position >= 0 && position < mValuesList.size() ? mValuesList.get(position) : ""; } }

Finalmente, la parte relevante del código fuente de la actividad:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); final ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(false); actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); actionBar.setDisplayHomeAsUpEnabled(true); mSpinner = (Spinner) findViewById(R.id.spinner_rss); String[] items = getResources().getStringArray(R.array.spinner_rss_items); List<String> spinnerItems = new ArrayList<String>(); for(int i = 0; i < items.length; i++) { spinnerItems.add(items[i]); } SpinnerAdapter adapter = new SpinnerAdapter(actionBar.getThemedContext(), spinnerItems); mSpinner.setAdapter(adapter); if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { mSpinner.setDropDownVerticalOffset(-116); } }

Estos son los resultados de Lollipop y Kitkat:

¡Espero eso ayude! :)


Puede corregir la posición desplegable (se mostrará en la parte superior de la barra de herramientas, como el menú) para Android 4 con este código:

<Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:dropDownVerticalOffset="-56dp"/>


Sé que es tarde pero me encontré con esta pregunta cuando me encontré con este problema y encontré una solución en la aplicación BrowseSessionsActivity de la aplicación Google I / O 2014 y la BrowseSessionsActivity .

Diseños

toolbar_spinner.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <Spinner android:id="@+id/toolbar_spinner" style="@style/Widget.MyApp.HeaderBar.Spinner" android:layout_width="wrap_content" android:layout_height="match_parent"/> </LinearLayout>

toolbar_spinner_item_actionbar.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawablePadding="8dp" android:drawableRight="@drawable/spinner_triangle" android:fontFamily="sans-serif" android:paddingLeft="16dp" android:paddingRight="4dp" android:textColor="#ffffffff" android:textSize="18dp" android:textStyle="bold"/> </LinearLayout>

El spinner_triangle se puede encontrar here .

toolbar_spinner_item_dropdown.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="48dp" android:drawablePadding="8dp" android:gravity="center_vertical|start" android:paddingLeft="16dp" android:paddingRight="16dp" android:textColor="#ff333333" android:textSize="16sp"/> </LinearLayout>

Estilos

toolbar_spinner.xml utiliza el siguiente estilo.

<style name="Widget.MyApp.HeaderBar.Spinner" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar"> <item name="android:background">?android:selectableItemBackground</item> <item name="android:dropDownSelector">?android:selectableItemBackground</item> <item name="android:divider">@null</item> <item name="android:overlapAnchor">true</item> </style>

Adaptador

Este adaptador deberá cambiarse para que coincida con sus propias necesidades. getTitle() devuelve el texto para cada elemento que se muestra en el control giratorio.

private class YourObjectSpinnerAdapter extends BaseAdapter { private List<YourObject> mItems = new ArrayList<>(); public void clear() { mItems.clear(); } public void addItem(YourObject yourObject) { mItems.add(yourObject); } public void addItems(List<YourObject> yourObjectList) { mItems.addAll(yourObjectList); } @Override public int getCount() { return mItems.size(); } @Override public Object getItem(int position) { return mItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getDropDownView(int position, View view, ViewGroup parent) { if (view == null || !view.getTag().toString().equals("DROPDOWN")) { view = getLayoutInflater().inflate(R.layout.toolbar_spinner_item_dropdown, parent, false); view.setTag("DROPDOWN"); } TextView textView = (TextView) view.findViewById(android.R.id.text1); textView.setText(getTitle(position)); return view; } @Override public View getView(int position, View view, ViewGroup parent) { if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) { view = getLayoutInflater().inflate(R.layout. toolbar_spinner_item_actionbar, parent, false); view.setTag("NON_DROPDOWN"); } TextView textView = (TextView) view.findViewById(android.R.id.text1); textView.setText(getTitle(position)); return view; } private String getTitle(int position) { return position >= 0 && position < mItems.size() ? mItems.get(position).title : ""; } }

Agregar el Spinner a su barra de herramientas

Toolbar toolbar = getActionBarToolbar(); View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner, toolbar, false); ActionBar.LayoutParams lp = new ActionBar.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); toolbar.addView(spinnerContainer, lp); YourObjectSpinnerAdapter spinnerAdapter = new YourObjectSpinnerAdapter(); spinnerAdapter.addItems(getMyObjectSpinnerData()); Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.toolbar_spinner); spinner.setAdapter(spinnerAdapter);

Resultado


Tenía exactamente el mismo problema con el spinner

Lo que hice fue agregar un tema personalizado a spinner

<Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="30sp" android:entries="@array/guest_type" android:prompt="@string/guesttype" android:theme="@style/AppTheme1" />

styles.xml

<style name="AppTheme1" parent="Theme.AppCompat.Light"> <item name="android:spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item> </style> <style name="mySpinnerItemStyle" parent="@android:style/Widget.Holo.DropDownItem.Spinner"> <item name="android:textColor">#000000</item> </style>


Una forma simple que no es perfecta, pero lo suficientemente uniforme como para 4.x y 5.0

Quité el <Spinner> de los archivos de diseño y lo agregué programáticamente, lo que permitió que el triángulo blanco se mostrara correctamente.

También creé un diseño de elemento desplegable usando el color requerido de appcompat.

layout / spinner_dropdown_item.xml, tenga en cuenta el android:background="@color/primaryColor"

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingLeft="12dp" android:paddingRight="12dp" android:background="@color/primaryColor" android:minHeight="?android:attr/listPreferredItemHeightSmall" />

Y en la actividad:

SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.your_array, R.layout.spinner_dropdown_item); Spinner navigationSpinner = new Spinner(getSupportActionBar().getThemedContext()); navigationSpinner.setAdapter(spinnerAdapter); toolbar.addView(navigationSpinner, 0);

No es perfecto y los elementos no se resaltan al hacer clic en ellos, pero es lo suficientemente bueno mientras esperamos que las futuras bibliotecas de compatibilidad de aplicaciones resuelvan estos problemas (aquí está la esperanza).


Usa la propiedad android: dropDownVerticalOffset dentro de spinner para dar espacio a la parte superior.

<Spinner android:id="@+id/spnrLanguage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:background="@drawable/ic_dropdown" android:padding="5dp" android:spinnerMode="dropdown" android:dropDownVerticalOffset="50dp" />

No olvides configurar android: spinnerMode = "dropdown" aunque no funcionará en el spinnerMode = dialog