Search code examples
androidbackgroundpopupandroid-spinnerandroid-2.3-gingerbread

How can I change the background color of a spinner popup?


I'm trying to set the background color of a spinner popup but everything I've tried didn't work properly.

This is the spinner control:

<Spinner
  android:id="@+id/myspinner"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@null"
  android:drawSelectorOnTop="true" />

When I click on it, it shows a popup with a white background, and I want to change that.

The xml line which I use to populate the popup is:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/list_selector"      
  android:paddingBottom="@dimen/padding_medium"
  android:layout_marginBottom="@dimen/padding_medium"
  android:orientation="vertical">
  
  ..........

</RelativeLayout>

and the drawable background list_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
  <!-- Pressed -->
  <item 
    android:state_pressed="true" 
    android:drawable="@color/green" /> <!--  @drawable/tab_press -->

  <!-- Selected -->
  <item 
    android:state_selected="true" 
    android:drawable="@color/green" /> <!--  @drawable/tab_press -->
 
</selector> 

Adding a default state to the above xml is ok, but the spinner main control shows the item with that background color, and I don't want that.

Another thing I've tried is to set the application background color to black in styles.xml

<style name="AppTheme" parent="android:Theme.Light">
     <item name="android:background">#000000</item>
     <item name="android:textColor">#FFFFFF</item>
     <item name="android:typeface">sans</item> 
</style>

That overrides the popup background too, but it has undesirable collateral effects. Is there any way to accomplish this in a simple way?

PS: I'm using API level 10 (2.3.3) and the attribute android:popupBackground doesn't exist.


Solution

  • None of the above solutions worked for me.

    The solution was writing in the adapter passed to the spinner a different implementation in the method getDropDownView to display a different layout with custom colors:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vista = convertView;       
    
        // layout for spinner widget
    
        if (vista==null) {
            LayoutInflater inflater = actividad.getLayoutInflater();
            vista = inflater.inflate(R.layout.fila_colores_spinner, null);                  
        }
    
        return vista;
    }
    
    @Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
        View vista = convertView;       
    
        //layout for spinner popup
    
        if (vista==null) {
            LayoutInflater inflater = actividad.getLayoutInflater();
            vista = inflater.inflate(R.layout.fila_colores_spinner_popup, null);                    
        }
    
        return vista;
    }