Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set a different theme for a Spinner's dropdown?

An example usage:

enter image description here

The Spinner is dark themed, but I want the dropdown to be light themed.

like image 328
Chris Banes Avatar asked Aug 18 '15 07:08

Chris Banes


People also ask

Which of the following look like a dropdownlist in Android?

Android Spinner is just a drop down list similar to what's seen in other programming languages such as in HTML pages. In Android, Spinner is used to select one value from a set of values. In the default state, a spinner shows its currently selected value.

How to create drop down menu in Android studio?

You can add a dropdown menu to your Android application in a few simple steps. For starters, you need to edit the XML files. Integrate the dropdown menu into them using Android Studio's drag-and-drop feature. Next, you have to create a string array to add all the relevant items to your dropdown menu.


2 Answers

Android M

New in Android 6.0, Spinner now has the android:popupTheme parameter which allows you to set the theme used for the popup (dropdown).

You can use it as so:

<Spinner     android:layout_height="wrap_content"     android:layout_width="match_parent"     android:popupTheme="@android:style/ThemeOverlay.Material.Light" /> 

That will work on devices running API level 23+, but not on devices running a lower version of Android.

AppCompat

This is where AppCompat comes in. Its Spinner implementation also supports popupTheme, but it's a bit more involved to get right.

<Spinner     android:layout_height="wrap_content"     android:layout_width="match_parent"     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

After that, you need to update your Adapter to be able to work with AppCompat. You do that by making it implement the new ThemedSpinnerAdapter interface.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {     Theme getDropDownViewTheme() { ... }     void setDropDownViewTheme(Theme theme) { ... }  } 

These methods are used by Spinner to be able to tell the Adapter which theme to use for inflating any drop down views. To make this as easy as possible we have given you a Helper class which you can plug in to your adapter.

This means that your adapter becomes something like:

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {   private final ThemedSpinnerAdapter.Helper mDropDownHelper;    public MyAdapter(Context context) {      mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);   }    @Override   public View getDropDownView(int position, View convertView, ViewGroup parent) {     View view;      if (convertView == null) {       // Inflate the drop down using the helper's LayoutInflater       LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();       view = inflater.inflate(R.layout.my_dropdown, parent, false);     }      // ...      return view;   }    @Override   public void setDropDownViewTheme(Theme theme) {     mDropDownHelper.setDropDownViewTheme(theme);   }    @Override   public Theme getDropDownViewTheme() {     return mDropDownHelper.getDropDownViewTheme();   } } 
like image 174
Chris Banes Avatar answered Oct 07 '22 22:10

Chris Banes


for spinner's arrow I've used android:backgroundTint="@color/white" this will work from API 21

for spinner view and dropdown view:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);  areasAdapter.setDropDownViewResource(R.layout.dropdwon_item); areasSpinner.setAdapter(areasAdapter); 

for getView() the adapter will use spinner_item.xml

for getDropDownView() the adapter will use dropdwon_item.xml

then you can use your custom layouts as you like

hope it helps

like image 34
bsma Avatar answered Oct 07 '22 22:10

bsma