Android: Де ховається атрибут кольору віджета Spinner?


77

Я намагаюся змінити колір тексту окремого елемента, який відображається на кнопці обертання після того, як ви вибрали елемент зі спадного меню. Вже годину я переглядаю themes.xml і styles.xml в Android SDK, і, здається, не можу знайти, звідки Spinner отримує значення кольору.

Для уточнення, Я НЕ намагаюся змінити колір випадаючого елемента, я намагаюся змінити колір тексту, що відображається у вертушці, коли спадного меню немає. Думаю, ви можете назвати це текстом "кнопки" спінера.


1
у блешні є колір і фон для тексту. Ви можете встановити його в SpinnerAdapter.getView ().
Ray Tayek 03.03.12

Відповіді:


108

Я думаю, що це, мабуть, такий біт у styles.xml

<style name="Widget.TextView.SpinnerItem">
    <item name="android:textAppearance">@style/TextAppearance.Widget.TextView.SpinnerItem</item>
</style>
<style name="Widget.DropDownItem.Spinner">
    <item name="android:checkMark">?android:attr/listChoiceIndicatorSingle</item>
</style>

- = EDIT = - Ось результат: введіть тут опис зображення

і ось як це робиться:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MooTheme" parent="android:Theme">
        <item name="android:spinnerItemStyle">@style/MooSpinnerItem</item>
    </style>

    <style name="MooSpinnerItem" parent="android:Widget.TextView.SpinnerItem">
        <item name="android:textAppearance">@style/MooTextAppearanceSpinnerItem</item>
    </style>

    <style name="MooTextAppearanceSpinnerItem" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
        <item name="android:textColor">#F00</item>
    </style>
</resources>

Потім просто додайте це до тегу програми у вашому AndroidManifest.xml

android:theme="@style/MooTheme"

Це стосується предметів обертання, які потрапляють у спадне меню. Мені це потрібно для тексту на самому спінері.
Крістофер Перрі,

Це власне спінер. Я редагую свою відповідь із повною реалізацією.
CaseyB

1
Я не розумію, тому що це говорить про те, що стосується прядок. Як це застосовується до блешні? Я бачу, що це насправді працює, тому я збираюся позначити ваш як відповідь, але мені справді цікаво, як це насправді працює, тому що я шукав у коді Spinner, щоб побачити, де відображається текст і де був втрата, щоб його знайти.
Крістофер Перрі,

Ви можете сказати мені, як зробити власний трикутник праворуч від спиннера?
pengwang

1
@pengwang - це частина дев'яти фонових патчів, які можна намалювати для Spinner.
Крістофер Перрі,

52

Так, CaseyB правильний.

Ось як я встановлюю колір тексту спінера, трохи простий приклад:

styles.xml

    <style name="Theme.NoTitleBar.WithColoredSpinners" parent="@android:style/Theme.NoTitleBar">
        <item name="android:spinnerItemStyle">@style/SpinnerItem</item>
        <item name="android:spinnerDropDownItemStyle">@style/SpinnerItem.DropDownItem</item>
    </style>

    <style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
        <item name="android:textColor">#00FF00</item>
    </style>

    <style name="SpinnerItem.DropDownItem" parent="@android:style/Widget.DropDownItem.Spinner">
        <item name="android:textColor">#FF0000</item>
    </style>

</resources>

Тоді у вашому маніфесті:

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.NoTitleBar.WithColoredSpinners" >

Текст на зовнішній стороні всіх ваших спінінгів тепер буде зеленим, а текст, що випадає, буде червоним.


Для теми AppCompat просто видаліть android:так<item name="spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item>
Roman_D

28

Я зробив це, використовуючи іншу просту техніку,

скопіюйте simple_spinner_item.xml та simple_spinner_dropdown_item.xml із папки Android res / layout та скопіюйте їх у свій проект.

Потім змініть наступні рядки

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, Android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinnerSubject.setAdapter(adapter);

як:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, R.layout.simple_spinner_item);
adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
spinnerSubject.setAdapter(adapter);

Все інше легко, тепер ви можете редагувати simple_spinner_item.xml, щоб редагувати зовнішній вигляд одного видимого елемента на віджеті вертушки, і редагувати simple_spinner_dropdown_item.xml, щоб змінити вигляд випадаючого списку.

Наприклад, моє розташування активності містить:

<Spinner
android:id="@+id/mo_spinnerSubject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/spinnerset_background" />

і мій simple_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:singleLine="true"
android:textColor="@color/custom_white"
android:textSize="16sp" />

а simple_spinner_dropdown_item.xml виглядає так:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@color/custom_black"
android:ellipsize="marquee"
android:singleLine="true"
android:textColor="@color/custom_white" />

3
Гарний приклад. Я не міг змусити інших працювати в моєму проекті, але це було легко і працювало як шарм.
raider33

2
Це також рішення, яке не формує новий стиль у всьому світі, як це роблять інші.
Герхард Бургер

26

Ви можете використовувати setOnItemSelectedListener на об'єкті Spinner,

spinnerObject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        ((TextView)parentView.getChildAt(0)).setTextColor(Color.rgb(249, 249, 249));
        // OR ((TextView)parentView.getChildAt(0)).setTextColor(Color.RED);
    }
});

1
це найпростіший метод тут :)
Василь Вальчев

1
Я вважаю, що спочатку потрібно перевірити, чи є у батьків діти, інакше виникає NullPointerException, коли я змінюю орієнтацію пристрою.
Девід Кібблвайт,

Це може бути найкращим рішенням, якщо колір встановлений лише для цієї однієї
блешні,

В ідеалі, якщо хтось хоче повторно використовувати свій адаптер Spinner, це найкращий спосіб зробити. Подяка працювала таким чином!
sud007

NPE 'void android.widget.TextView.setTextColor (int)'
vlasentiy

12

це дуже просто насправді. Я шукав у всьому, вам просто потрібно створити стиль і встановити на блешню

спочатку створіть свою тему в Style.xml

 <style name="spinnerTheme" parent="android:Theme">
    <item name="android:textColor">@color/gray_dark</item>
</style>

то у своєму xml, де ви встановили ваш спінер, додайте це:

android: theme = "@ style / spinnerTheme "

                       <Spinner
                        android:id="@+id/spinner"
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:padding="10dp"
                        android:paddingBottom="5dp"
                        android:paddingLeft="10dp"
                        android:layout_span="3"
                        android:layout_weight="1.3"
                        android:theme="@style/spinnerTheme"
                        android:textSize="12sp"
                        android:spinnerMode="dialog"
                        android:clickable="false"/>

Насолоджуйтесь кодуванням


Відмінно! Я використовував @android: color / holo_orange_light
pollaris

Це також змінює кольори тексту як для елемента, так і для спадного меню
ymerdrengene

1

Я не думаю, що з текстом пов’язаний колір. Його, швидше за все, заздалегідь визначене в коді андроїда, можливо, доведеться просто зробити власноруч, якщо ви хочете змінити колір спінера.

Це включало б зміну методу ondraw (), і ви намалювали блешню, як ви хотіли б, щоб вона виглядала.

Єдине, що, на мою думку, потенційно може вирішити цю проблему, - це властивість стилю спінера.

Джерело: http://developer.android.com/reference/android/widget/Spinner.html

Це може допомогти:

http://www.designerandroid.com/?p=28


1
Ну, причина, по якій я думаю, що це десь у стилі, полягає в тому, що коли я переходжу з Holo на Holo.Light тему, колір тексту на блешнях змінюється з білого на чорний.
Крістофер Перрі,

Ну, ви могли б визначити свій власний стиль, а потім застосувати його до блешні, так?
JoxTraex

1
Я міг би, але я не маю уявлення, який атрибут замінити на колір тексту, звідси і моє запитання.
Крістофер Перрі,

1

Можна змінити колір тексту, замінивши метод getView наступним чином:

new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_dropdown_item, list()){
                @Override
                public View getView(int position, View convertView, @NonNull ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    //change the color to which ever you want                    
                    ((CheckedTextView) view).setTextColor(Color.RED);
                    return view;
              }

0

це допомогло мені створити власний файл макета зі спеціальним визначенням для елемента обертання.

custom_spinner.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/txt_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#ffffff" />

Змініть предмет блешні за допомогою адаптера

Spinner spinner= (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.by_loc_array,R.layout.txt_spinner);
spinner.setAdapter(adapter);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.