我认为你想要改变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文件。
想自己尝试一下,从这里开始?