我正在使用微调器并想要添加微调器 - 改变行为取决于状态(聚焦、按下)
示例项目在这里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 的默认颜色)
如何启用微调器的选择器?
也是一个官方错误... 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>
祝你好运!
<?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
可能还有其他方法,但这是我从使用其中一个生成器中了解到的。
在指向您的可绘制对象的
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
值将取决于项目的设置方式,我认为这将决定项目中旋转器的样式,而不仅仅是一个。尝试一下,让我知道你得到了什么。
这是另一个类似于 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
的属性。