如何更改android微调器popupBackground

时间:2012-01-19 08:18:55

标签: android android-widget android-spinner

我试图通过设置android:popupBackground来改变android微调器弹出窗口背景,但它没有任何效果。有什么方法可以改变它吗?

    <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">

2 个答案:

答案 0 :(得分:17)

我认为你试图改变Spinner弹出窗口的“外部”背景,而不是Spinner“pupup items”的背景。此外,我认为通过弹出窗口,您的意思是Spinner的对话框模式,其中浮动对话框窗口出现在您的活动之上,而不是新的下拉模式。

策略

对于一个干净,可持续的方法,它在多个Android平台上表现良好,并减少了应用程序中的冗余需求,我认为必须了解官方文档没有告诉我们的内容。所以请跟我走一小段路。

关于Spinners的棘手部分是使用 Adapter 将它们连接到数据。虽然识别用于更改android.R.layout.simple_spinner_item及其朋友的外观的钩子相对容易,但这些只能确定Spinner当前显示的项目的样式以及每个弹出项目。但是 Adapter 负责创建 ListView 和其他构成ListView的小部件。

这种复杂性可能就是为什么Android引入了一些可以即时“为” Spinner 指定的属性的原因,尽管它们随后应用于Spnner的子节点,例如机器人:popupBackground 。这不一定是一种干净的方法,而是一组有限的便利功能。关于popupBackground,顺便说一句,这是在API级别1中引入的,但Spinners仅在 spinnerMode = dropdown 中尊重它,这是在API级别11中引入的。这就是为什么你永远不会得到通知的原因错误地使用它。

较早的Android版本(例如2.2)

的ListView

知道 Adapter 创建 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)

现在AlertDialogs的样式,我们仍然必须解决这样一个事实,即更新版本的Android不再使用AlertDialogs用于Spinner对话框了。这并没有伤害,因为对于那些人,应该保持AlertDialog风格。这只意味着我们也需要设置新弹出窗口的样式。

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

感觉就像自己尝试一样,从这里开始?

答案 1 :(得分:10)

android:popupBackground仅在使用android:spinnerMode = "dropdown"时有效,这可能就是为什么它在您的代码中没有任何影响。你需要告诉那个微调器哪个模式带有一些XML。

android:spinnerMode = "dropdown"

链接

相关问题