Android: не может стиль spinner divider

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

вот мой стиль.xml-файл (сокращенно для ясности):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyTheme" parent="android:Theme.Light">
    <item name="android:spinnerStyle">@style/spinnerStyle</item>
    <item name="android:spinnerDropDownItemStyle">@style/spinnerDropDownItemStyle</item>    
    <item name="android:dropDownListViewStyle">@style/spinnerListViewStyle</item>
  </style>

  <style name="spinnerStyle" parent="@android:style/Widget.Spinner">
      <item name="android:background">@drawable/my_theme_spinner</item>
  </style>

  <style name="spinnerDropDownItemStyle" parent="@android:style/Widget.DropDownItem.Spinner">
      <item name="android:background">@drawable/my_theme_spinner_item</item>
      <item name="android:paddingLeft">5dp</item>
      <item name="android:gravity">center_vertical</item>
  </style>

  <style name="spinnerListViewStyle" parent="@android:style/Widget.ListView.DropDown">
      <item name="android:height">3dp</item>
      <item name="android:dividerHeight">3dp</item>
      <item name="android:divider">@color/divider</item>
  </style>
</resources>

независимо от того, что я делаю, я просто получаю свет 1dp серый разделитель между элементами (который едва можно увидеть с моим светлым фоном элемента списка) - ни высота, ни цвет разделителя никогда не затрагиваются (я также попытался установить его в drawable, также без эффекта). Что я делаю не так?

4 ответов


у меня очень простая деятельность с Прядильщиком, и она работает для следующего. Единственное отличие, которое я вижу, что у вас есть <item name="android:height">3dp</item> и у меня нет вообще.

<style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown">
    <item name="android:divider">#ff0000</item>
    <item name="android:dividerHeight">5dp</item>
</style>


<style name="SampleTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:dropDownListViewStyle">@style/TestSpinnerStyle</item>
</style>

и в моей деятельности у меня есть:

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    List<String> list = new ArrayList<String>();
    list.add("list 1");
    list.add("list 2");
    list.add("list 3");
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinner.setAdapter(dataAdapter);

и затем для основного макета у меня есть следующий XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, StylingActivity"
            />
    <Spinner android:id="@+id/spinner"
             android:layout_width="250dp"
             android:layout_height="40dp"
             />
</LinearLayout>

скриншот

sample activity screnshot

если вы не можете заставить его работать оттуда, я могу поднять все это до репозитория github для вы.


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

редактировать

некоторые дальнейшие поиски нашли это:

так что ответ

что в основном говорит о том, что вы пытаетесь сделать выше, должно работать... хотя в нем упоминается установка этого стиля в вашем активность тема, и вы не упоминаете об этом.


вы можете сделать это в макете.в XML

     <Spinner
                android:id="@+id/sp_to_create"
                android:layout_width="match_parent"
                android:layout_height="32dp"
                android:layout_marginBottom="10dp"
                style="@style/spinner_style"
                android:prompt="@string/to_type_prompt" />

стили XML добавить его

 <style name="spinner_style" parent="Widget.AppCompat.ListView.DropDown">
    <item name="android:divider">#d1d1d1</item>
    <item name="android:dividerHeight">0.5dp</item>
</style>

добавить в свою тему Деятельность

      <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:dropDownListViewStyle">@style/spinner_style</item>
</style>

ФАЙЛ JAVA

your_spinnerList.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, timeOff_type_list));

Дайте мне знать, если это было полезно для вас! Хорошего дня!


метод стиля в принятом ответе работает хорошо, пока вам не понадобятся два блесны с разными цветами делителя.

вот что я нашел работает в качестве альтернативы:

a) установите атрибут popupBackgroundColor на прядильщике в цвет, который вы хотите для делителя. Это будет цвет фона всего элемента списка (включая пространство, которое мы считаем разделителем).

b) установите адаптеры spinners dropDownViewResource как CheckedTextView с его атрибут фона устанавливается в какой-либо другой цвет (или селектор, если вы хотите, чтобы выбранные элементы имели другой цвет). Это переопределит цвет, который мы установили на шаге a для всего, кроме разделителя. эффективно давая нам желаемый результат.

так у вас будет:

drawable/spinner_dropdown_background_selector:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/your_unchecked_color" android:state_checked="false"/>
    <item android:drawable="@color/your_checked_color" android:state_checked="true"/>
    <item android:drawable="@color/your_unchecked_color"/>

</selector>

layout / drop_down_item.XML-код:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@android:id/text1"
             android:background="@drawable/spinner_dropdown_background_selector"
             android:textColor="@android:color/white"
             android:singleLine="true"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:ellipsize="marquee" />

определение вашего спиннера:

<Spinner
        ...
        android:popupBackground="@color/your_divider_color"            
        ...
        />

и, наконец, Ваш массив определение адаптера:

ArrayAdapter<String> dataAdapter = new ...
dataAdapter.setDropDownViewResource(android.R.layout.drop_down_item);
spinner.setAdapter(dataAdapter);

обратите внимание, что установка popupBackgroundColor не имеет никакого эффекта, если счетчик находится в режим.