it-swarm.com.ru

Android: Невозможно установить спиннер

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

Вот мой файл styles.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, также без эффекта). Что я делаю неправильно?

13
Russ

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

25
christophercotton

Вы можете сделать это в вашем layout.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 FILE

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

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

1
Cristofer

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

ПРАВКА

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

SO Ответ

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

1
Barak

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

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

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

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

Итак, вы будете иметь:

рисуем/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>

макет/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 не имеет никакого эффекта, если счетчик находится в диалоговом режиме .

0
Oren