Как изменить цвет фона всплывающего окна?

Я пытаюсь установить цвет фона всплывающего окна spinner, но все, что я пробовал, не работает должным образом.

Это элемент управления spinner:

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

Когда я нажимаю на него, он показывает всплывающее окно с белым фоном, и я хочу изменить его.

Строка xml, которую я использую для заполнения всплывающего окна:

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

и извлекаемый фон 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> 

Добавление состояния по умолчанию к указанному выше xml в порядке, но главный элемент spinner показывает элемент с этим фоновым цветом, и я не хочу этого.

Еще одна вещь, которую я пробовал, - установить цвет фона приложения в черный в 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>

Это также перекрывает всплывающий фон, но имеет нежелательные побочные эффекты. Есть ли способ сделать это простым способом?

Спасибо!

PS: Я использую API-уровень 10 (2.3.3), а атрибут android:popupBackground не существует.

Ответ 1

Ни один из вышеперечисленных решений не работал у меня.

Решение заключалось в том, что в адаптере, переданном на счетчик, была написана другая реализация в методе getDropDownView для отображения другого макета с пользовательскими цветами:

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

Ответ 2

Использовать android: popupBackground = "@drawable/Yourxmlfile.xml" в объявлении spinner для xml.

Например,

    <Spinner
        android:id="@+id/spinner3"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:layout_weight="50"
        android:background="@drawable/gradient_spinner"
        android:gravity="center"
        android:paddingLeft="40dp"
        android:popupBackground="@drawable/radialfront"
        >

Ответ 3

Он отлично работает!

  • объявить макет с текстовым видом с желаемым цветом (и другими атрибутами, которые вы хотите изменить)
  • идентификатор textView должен быть text1 (это означает, что это идентификатор, объявляемый в по умолчанию в Randroid для ваш счетчик)
  • укажите этот макет в своем адаптере spinner

например:

  • в res\layout\custom_spinner_item.xml поставьте это:

     
    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:background="#B2B5B7"
                    android:gravity="center_horizontal"
                     android:textSize="20dp"
    

затем дайте этот макет адаптеру:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
      MyActivity.this,
      R.layout.custom_spinner_item, strings);
  • затем отнесите этот адаптер к вашему счетчику

Ответ 4

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

попробуйте это.