在使用
Holo
主题时,实现
Spinner
的多行下拉项目是不可能的,这是我试过的。解决方法是:
- 为
Spinner
创建一个不继承自Holo
的样式。这将启用多行下拉项目。
- 手动对Spinner进行样式设计,使其看起来像是
Holo
主题。
这将产生以下效果(显示关闭和打开状态):
具体实现细节如下:
在我看来,即使将下拉项目的
TextView
singleLine
属性设置为
false
并提供自定义布局,也没有办法从
Holo
主题继承到
Spinner
并在
Spinner
中显示多行。我还尝试了保留
Holo
样式但更改了
android:spinnerStyle
android:spinnerItemStyle
android:spinnerDropDownItemStyle
样式属性(使用这些属性的示例在此处),但我无法使其产生多行结果。
然而,如果我们覆盖Spinner
的样式,并且不从Holo
继承spinnerStyle
:
<style name="AppTheme" parent="android:Theme.Holo.Light">
<item name="android:spinnerStyle">@style/spinnerStyle</item>
</style>
<--no parent attribute-->
<style name="spinnerStyle">
<item name="android:clickable">true</item>
</style>
那么下拉菜单项将支持显示多行。但现在我们失去了Holo
主题在Spinner
上,关闭状态看起来像一个TextView
而不是Spinner
,没有箭头或视觉提示它是一个Spinner
。如果我们改为将spinnerStyle
的父级设置为:parent="android:style/Widget.Spinner
:
<style name="spinnerStyle" parent="android:style/Widget.Spinner">
<item name="android:clickable">true</item>
</style>
Spinner
关闭状态将显示箭头,但样式类似于灰色的pre-Holo Spinner
,看起来与Holo
应用不协调。因此,一种可能的解决方案是:
- 覆盖
spinnerStyle
主题并不使用父级的Holo
。这将使DropDown项中的文本多行显示。
- 更改
Spinner
背景以使其看起来继承了Holo
主题。
以下是一个示例:
创建一个基本的Activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner = (Spinner)findViewById(R.id.styled_spinner);
spinner.setAdapter(ArrayAdapter.createFromResource(this,
R.array.items,
R.layout.spinner_item));
}
活动布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="50dip"
tools:context=".MainActivity" >
<Spinner
android:id="@+id/styled_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
样式:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="android:Theme.Holo.Light">
<item name="android:spinnerStyle">@style/spinnerStyle</item>
</style>
<style name="spinnerStyle">
<item name="android:clickable">true</item>
<item name="android:background">@drawable/spinner_background_holo_light</item>
</style>
</resources>
在drawable文件夹中,放置spinner_background_holo_light:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/spinner_disabled_holo_light" />
<item android:state_pressed="true"
android:drawable="@drawable/spinner_pressed_holo_light" />
<item android:state_pressed="false" android:state_focused="true"
android:drawable="@drawable/spinner_focused_holo_light" />
<item android:drawable="@drawable/spinner_default_holo_light" />
</selector>
将这些可绘制对象包含在您的drawables-hdpi
文件夹中:
spinner_default_holo_light.9.png
spinner_disabled_holo_light.9.png
spinner_focused_holo_light.9.png
spinner_pressed_holo_light.9.png
这将产生一个带有Holo
主题的关闭状态和多行项目的下拉菜单,如上面的屏幕截图所示。
此示例中的下拉项不是Holo
主题,但如果多行显示下拉项真的很重要,则这可能是可以接受的折衷方案。
在此示例中,清单中的android:minSdkVersion
设置为14
,android:targetSdkVersion
设置为17
。
Holo
图形和spinner_background_holo_light.xml
代码来自HoloEverywhere版权所有(c)2012 Christophe Versieux,Sergey Shatunov。有关许可详细信息,请参见链接到github项目。