我该如何改变下拉框的文本样式?

20
我在我的布局xml文件中创建了一个下拉选项框(spinner),并将一个字符串数组设置为这个下拉选项框的内容。如果我更改下拉选项框的文本样式,文本不会受到影响。
我在googlegroups中阅读到,下拉选项框没有文本,因此文本样式不能被更改,而且必须更改在下拉选项框中显示的textview的样式。但是如何做到呢?最好在我的xml文件中完成。
6个回答

30

正如我的前任所指定的那样,您不能在包含Spinner组件的主XML布局文件中执行此操作。

上面的答案很好,但如果我们想要使用Google的最佳实践,比如使用样式来管理所有东西,你可以按以下3个“简单”的步骤进行:

第一步:您需要在布局文件夹下创建一个额外的文件,用于设置Spinner项目的外观:

<?xml version="1.0" encoding="utf-8"?>
<TextView  
    android:id="@+id/textViewSpinnerItem" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    style="@style/SpinnerTextViewItem"
    xmlns:android="http://schemas.android.com/apk/res/android" />

给这个文件取名:spinner_item_text.xml

步骤2:然后,在您的Activity类中,当您正在用一个项目数组填充Spinner时:

adapter = new ArrayAdapter<CharSequence>(this, R.layout.spinner_item_text, items);
spinner.setAdapter(adapter);

请注意:R.layout.spinner_item_text 资源应该在你自己的 R 文件中。

第三步: 在你的values文件夹下,创建或使用(你可能已经有一个)styles.xml文件。所需的样式条目应该像这个:

<style name="SpinnerTextViewItem" parent="@android:style/Widget.TextView" >
    <item name="android:textSize" >8dp</item>
    <item name="android:textStyle" >bold</item>
</style>

就是这样了!

到目前为止,在styles.xml文件中放置关于文本大小、样式、颜色等的所有内容非常实用,因此很容易维护。


1
<item name="android:textAppearance"> @android:style/TextAppearance.Holo.Widget.TextView.SpinnerItem </item>(或任何适合主题的样式)添加到SpinnerTextViewItem中,可以确保字体颜色在下拉列表背景上可见。 - Andrew Keeton
1
不错的实现,但你实际上可以全部用XML来完成。请参考@Cyril REAL的答案:https://dev59.com/cXA75IYBdhLWcg3wm6Uj#8871505 - Joshua Pinter
如果我只想对顶部元素进行操作怎么办? - Tushar Gogna

23

仅通过XML实现

作为对@Cyril REAL出色答案的跟进,这是一个详细的实现方法,如果您通过android:entries填充Spinner,则可以只使用XML来样式化它。

上面的答案适用于您通过代码创建Spinner,但如果您通过XML设置Spinner条目,即使用android:entries,则可以使用以下两个主题设置调整文本大小和其他属性:

在res/values/styles.xml中

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

    <style name="AppBaseTheme" parent="android:Theme.Holo">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">

        <!-- For the resting Spinner style -->
        <item name="android:spinnerItemStyle">
            @style/spinnerItemStyle
        </item> 

        <!-- For each individual Spinner list item once clicked on -->
        <item name="android:spinnerDropDownItemStyle">
            @style/spinnerDropDownItemStyle
        </item>

    </style>

    <style name="spinnerItemStyle">
        <item name="android:padding">10dp</item>
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="spinnerDropDownItemStyle">
        <item name="android:padding">20dp</item>
        <item name="android:textSize">30sp</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

</resources>

3
对于AppCompat主题,只需像这样删除android:即可:<item name="spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item>。 - Roman_D

19

当您创建支持Spinner的适配器时,您可以为Spinner项设置布局。

spinner.setAdapter(new ArrayAdapter(this, R.id.some_text_view));

你可以按照你想要的样式来设置some_text_view。

<TextView android:id="@+id/some_text_view" android:textStyle="bold" />

有没有可能在xml文件中完成这个操作?如果我在xml中设置了项目,就不需要自己设置ArrayAdapter... - Janusz
2
如果您使用android:entries,则内部会创建一个ArrayAdapter,其中android.R.layout.simple_spinner_item作为布局,否则您无法更改该布局,因为它是Android内部的。 - Robby Pond

9
实际上,您可以通过XML自定义下拉框的文本。
按照您自己的样式,定义一个:
<item name="android:spinnerItemStyle">@style/yourStyleForSpinnerItem</item>

并且也要定义这个样式:

<style name="yourStyleForSpinnerItem">

  // Stuff you want for the item style.

</style>

当您在Java代码中实例化Spinner的适配器时,可以使用默认的android.R.layout.simple_spinner_item。

这对我很有效,而且比在代码中定义所有适配器而不是XML要容易得多。 - Carrie Hall
请问您能否详细解释一下吗?'item' 应该在哪里定义?我在Spinner中如何设置样式? - Adreamus
android:spinnerItemStyle是主题的属性。此属性是对下拉列表项样式的引用。因此,如果您将此项放入您用于应用程序的自定义主题中,它将会被使用。主题通常作为某个默认的Android主题的后代存储在themes.xml中。欲获得更多信息,请访问此处:http://developer.android.com/guide/topics/ui/themes.html。 - Bhiefer
要自定义实际的 spinner 列表项,请改用 android:spinnerDropDownItemStyle - Joshua Pinter

1
如果你不想使用这样的解决方法,还有一个简单的方法。从下拉列表中获取TextView并更改它的参数:
TextView tv = (TextView) spin.getSelectedView();
tv.setTypeface(Typeface.DEFAULT_BOLD); //to make text bold
tv.setTypeface(Typeface.DEFAULT); //to make text normal

0
如果你只想改变下拉列表中弹出视图的背景,调用此方法:
spinner.setPopupBackgroundResource(R.color.pa_md_white);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接