<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">
解决方法
战略
对于一个干净,可持续的方法,它在多个Android平台上表现良好,并减少了应用程序中的冗余需求,我认为理解官方文档没有告诉我们的内容是至关重要的.所以跟我走一小段路.
关于Spinners的棘手部分是使用适配器将它们连接到数据.虽然识别用于更改android.R.layout.simple_spinner_item及其朋友的外观的钩子相对容易,但这些只能确定Spinner当前显示的项目的样式以及每个弹出项目.但它是适配器负责创建ListView和其他框架ListView的小部件.
这种复杂性可能是为什么Android引入了一些可以即时“为”Spinner指定的属性的原因,尽管它们然后应用于Spnner的子节点,例如android:popupBackground.这不一定是一种干净的方法,而是一组有限的便利功能.关于popupBackground,顺便说一句,这是在API级别1中引入的,但Spinners仅在spinnerMode = dropdown中尊重它,这是在API级别11中引入的.这就是为什么如果你错误地使用它就永远不会得到通知的原因.
较旧的Android版本(例如2.2)
列表显示
知道适配器创建了一个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:提示符可用于为弹出窗口创建标题,弹出窗口实际上不仅仅包含ListView.
Android使用AlertDialog
最近的Android版本(例如4.2)
现在AlertDialogs的样式,我们仍然必须解决这样一个事实,即更新版本的Android不再使用AlertDialogs用于Spinner对话框了.这并没有伤害,因为对于那些人,应该保持AlertDialog风格.这只意味着我们需要设置新弹出窗口的样式.
为此,请创建特定于版本的主题XML文件,以将其他样式提取到自定义主题中,并提供特定于版本的样式XML文件.
从这里开始,感觉就像尝试一样吗?