如何更改Android Spinner的弹出背景颜色

7

我试图通过设置android:popupBackground来更改Android Spinner弹出窗口的背景,但效果不明显。有没有什么办法可以改变它?

    <Spinner
           android:id="@+id/eventNameSpinner"
           android:layout_width="160dp"
           android:layout_height="30dp"
           android:layout_alignParentLeft="true"
           android:layout_centerVertical="true"
           android:layout_marginLeft="6dp"
           android:background="@drawable/btn_name"
           android:paddingBottom="2dp"
           android:paddingTop="2dp"
           android:popupBackground="@drawable/bkg">

我指的是为Spinner设置android:popupBackground="@drawable/bkg"并不能达到改变弹出窗口背景的预期效果。 - Wenbo
你应该发布图片! - Hiral Vadodaria
2个回答

17

我认为你想要改变Spinner弹出窗口的"外部"背景,而不是Spinner "弹出项"的背景。同时,我假设你所说的弹出窗口是指Spinner的对话框模式,在这种模式下,一个浮动对话框窗口会出现在你的活动上方,而不是新的下拉菜单模式。

策略

为了实现一个干净、可持续的方法,并且在多个Android平台上表现良好,减少应用程序中的冗余,我认为理解官方文档没有告诉我们的内容是至关重要的。请跟随我进行一次简短的旅程。

Spinner的棘手之处在于需要使用适配器将其与数据连接起来。虽然很容易识别出更改android.R.layout.simple_spinner_item及其相关样式的钩子,但这些只确定当前显示项以及每个单独弹出项的Spinner样式。而创建ListView和其他小部件以构建该ListView的任务则落在了适配器身上。

这种复杂性可能是Android引入了一些属性的原因,这些属性可以在运行时为Spinner指定,尽管它们随后被应用于Spinner的子项,例如android:popupBackground。这并不一定是一种干净的方法,而是一组有限的便利函数。顺便说一下,关于popupBackground,它是在API级别1引入的,但只有在API级别11中引入的spinnerMode=dropdown中,Spinner才会对其进行处理。这就是为什么如果使用不当,你永远不会收到通知的原因。

旧版Android(如2.2)

ListView

知道适配器创建了一个ListView,将ListView外观更改为主题中的一个不失为一个好主意,因此设计更改和样式化都在一个地方进行,像这样:

<style name="MyTheme" parent="@android:style/[reference to original theme]" >
    <item name="android:listViewStyle">@style/myListView</item>
    [...]
</style>

<style name="myListView" parent="@android:style/Widget.ListView">
    [check Android's Widget.ListView to understand what you can change here]
</style>

AlertDialog

很遗憾,还有更多的工作要做。因为android:prompt可以用来创建弹出窗口的标题,所以该弹出窗口实际上不仅仅包含ListView。

Android使用了一个AlertDialog

最近的Android版本(如4.2)

现在AlertDialog已经被样式化了,但我们仍然需要处理一个问题,即较新版本的Android不再使用AlertDialog作为Spinner对话框。这并没有影响,因为针对这些对话框,AlertDialog样式应该保持不变。这意味着我们还需要为新的弹出窗口设置样式。

为此,请创建特定于版本的主题XML文件以将其他样式引入您的自定义主题,并提供特定于版本的样式XML文件。

想自己尝试一下,从这里开始?


"...我们仍然需要解决一个问题,即较新版本的Android不再使用AlertDialogs作为Spinner对话框。" 在这里使用的是Android 6.0,并且更改<item name="android:alertDialogTheme">仍然可以解决问题。 - Overclover

10

谢谢。但是如果我使用对话框作为旋转器模式,有没有办法更改弹出窗口的背景? - Wenbo
我不知道,但你总是可以做你自己的Spinner。看一下http://adanware.blogspot.se/2012/03/android-custom-spinner-with-custom.html。 - Entalpi

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