Spinner 不应用 dropDownSelector 属性

问题描述 投票:0回答:4

我正在使用微调器并想要添加微调器 - 改变行为取决于状态(聚焦、按下)

示例项目在这里https://github.com/vovs/spinner_issue

我的代码:

activity_main.xml

<Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:spinnerMode="dropdown"
        android:dropDownSelector="@drawable/spinner_state" />

spinner_state.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@color/black" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@color/red" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@color/red" />
    <item
        android:state_enabled="true"
        android:drawable="@color/gray" />
</selector>

AndroidManifest:

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

因此,如果我在模拟器 Android 4.0.2 API 14 中运行应用程序并尝试选择某些项目或使用鼠标滚轮滚动,则不会有任何效果,我在选择器中设置(当按下或滚动时 - 项目应该是红色的,但它为蓝色 - ICS 颜色的默认值)。

对于 Android 2.2 API 8,当按下或使用滚轮滚动时(在这种情况下状态为焦点)颜色为黄色[橙色](Android 2.2 的默认颜色)

如何启用微调器的选择器?

enter image description here

android spinner android-spinner
4个回答
9
投票

也是一个官方错误... https://code.google.com/p/android/issues/detail?id=24922

有什么帮助:

<resources>
    <style name="Theme.MyTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:dropDownListViewStyle">@style/Theme.MyListView</item>
    </style>

    <style name="Theme.MyListView" parent="@android:style/Widget.Holo.Light.ListView">
        <item name="android:listSelector">@drawable/orange_list</item>
    </style>
</resources>

祝你好运!


3
投票
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@color/lighter_gray_no_transparent" />
    <item android:state_selected="true" android:drawable="@color/lighter_gray_no_transparent" />
    <item android:state_pressed="true" android:drawable="@color/lighter_gray_no_transparent" />
    <item android:drawable="@android:color/transparent"/>
</selector>

<color name="lighter_gray_no_transparent">#FFDDDDDD</color>

为您的项目视图设置背景选择器,仅此而已。为我工作。 颜色alpha值必须为FF,否则会显示橙色背景,左边一个颜色值是#FFDDDDDD,右边一个是#55DDDDDD

enter image description here enter image description here


1
投票

可能还有其他方法,但这是我从使用其中一个生成器中了解到的。

在指向您的可绘制对象的

res/values/styles.xml
中声明您自己的微调器样式。

<style name="myCustomSpinner" parent="android:Widget.Holo.Light.Spinner">
    <item name="android:background">@drawable/spinner_state</item>
</style>

创建

res/values/themes.xml
并声明继承当前主题的您自己的主题。在此主题中,为您要修改的每个属性添加一个项目,并将其指向上一步中的自定义样式。我认为如果您愿意,这可以放入样式文件中,但由于生成器将它们分开,所以我也照着做。

<style name="myCustomTheme" parent="android:Theme.Light">
    <item name="android:dropDownSpinnerStyle">@style/myCustomSpinner</item>
</style>

在您的

AndroidManifest
中,将
android:theme="@style/myCustomTheme"
添加到起始
application
标签。

您的

parent
值将取决于项目的设置方式,我认为这将决定项目中旋转器的样式,而不仅仅是一个。尝试一下,让我知道你得到了什么。


0
投票

这是另一个类似于 es0329 给出的解决方案:

    <style name="Base.Theme.SpinnerDemo" parent="Theme.Material3.DayNight.NoActionBar">
        <item name="android:dropDownListViewStyle">@style/My.Theme.Spinner</item>
    </style>

    <style name="My.Theme.Spinner" parent= "android:Widget.ListView">
        <item name="android:divider">@null</item>
        <item name="android:listSelector">@drawable/spinner_selector</item>
    </style>

这是我对其如何以及为何起作用的解释。

为什么
android:dropDownSelector
不起作用?

这一切都取决于我们单击微调器时发生的情况。单击后,它将经历一个创建DropDownListView的过程。

在创建过程中,它将使用内置属性

R.attr.dropDownListViewStyle
来创建AbsListView

然后,AbsListView 将从

R.styleable.AbsListView_listSelector
attr 中提取可绘制对象,这将成为选择器:

final Drawable selector = a.getDrawable(R.styleable.AbsListView_listSelector);
if (selector != null) {
    setSelector(selector);
}

因此,我们赋予 Spinner 的

android:dropDownSelector
对于为弹出窗口创建的 AbsListView 没有任何影响。

这就是为什么为了实际设置选择器,我们需要更改主题中的

android:listSelector

为什么使用
android:Widget.ListView
作为主题的父主题?

如果我们查看我们的应用程序主题,我们应该发现类似这样的内容:

<style name="{THEME_NAME}" parent="{PARENT_THEME}">
    <item name="dropDownListViewStyle">?android:attr/dropDownListViewStyle</item>
    <item name="android:dropDownListViewStyle">@style/Widget.AppCompat.ListView.DropDown</item>
</style>

在我的例子中,

dropDownListViewStyle
默认是
@style/Widget.AppCompat.ListView.DropDown
,它继承自
android:Widget.ListView

<style name="Base.Widget.AppCompat.ListView" parent="android:Widget.ListView">
    <item name="android:listSelector">?attr/listChoiceBackgroundIndicator</item>
</style>

所以为了不搞乱其他设置,我决定使用

android:Widget.ListView
作为父级并更改
android:listSelector
的属性。

© www.soinside.com 2019 - 2024. All rights reserved.