Android:Spinner小部件的文本颜色属性隐藏在哪里?


77

从下拉列表中选择一个项目后,我正在尝试更改微调按钮中显示的单个项目的文本颜色。我已经在Android SDK中仔细阅读了themes.xml和styles.xml一个小时,而且似乎找不到Spinner从何处获取颜色值。

为了澄清起见,我不是在尝试更改下拉菜单项的颜色,而是在没有下拉菜单时尝试更改微调框显示的文本的颜色。我想您可以将其称为微调框的“按钮”文本。


1
微调器中的文本有颜色和背景。您可以在SpinnerAdapter.getView()中进行设置。
Ray Tayek'3

Answers:


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>

-=编辑=-这是结果: 在此处输入图片说明

这是完成的过程:

<?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代码以查看文本的显示位置和所在位置。找不到它。
克里斯托弗·佩里

您能告诉我如何在spnner的右边做自定义三角形吗?
pengwang 2011年

1
@pengwang是Spinner可绘制的九个补丁背景的一部分。
Christopher Perry

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

28

我是用另一种简单的技术做到的

从Android res / layout文件夹复制simple_spinner_item.xml和simple_spinner_dropdown_item.xml并将它们复制到您的项目中。

然后修改以下几行

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
这也是一个不会像其他公司那样在全球范围内强制采用新样式的解决方案。
Gerhard Burger

26

您可以在Spinner对象上使用setOnItemSelectedListener,

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
这是最简单的方法:)
Vasil Valchev 2013年

1
我发现我必须先检查父母是否有孩子,否则每当我更改设备的方向时都会引发NullPointerException。
David Kibblewhite 2014年

如果仅为该旋转器设置颜色而不是为全局设置颜色,这可能是最佳解决方案
bkurzius

理想情况下,如果有人想重新利用其微调适配器,这是最好的方法。谢谢那样工作!
sud007


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

这也改变了项目和下拉菜单的
文本颜色

1

我认为文本没有颜色。如果您想更改微调框的颜色,则最有可能在android代码中进行了预定义。

这将包括更改ondraw()方法,然后您将旋转器绘制为您希望的样子。

我认为唯一可以解决此问题的是微调器的样式属性。

来源:http : //developer.android.com/reference/android/widget/Spinner.html

这可能会有所帮助:

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


1
好吧,我之所以认为它具有某种风格,是因为当我从Holo更改为Holo.Light主题时,微调框上的文本颜色从白色变为黑色。
克里斯托弗·佩里

好吧,您可以定义自己的样式,然后将其应用于微调器,对吗?
JoxTraex 2011年

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.