通过状态选择器更改数字选择器的文本颜色



我正在尝试更改数字选择器的文本颜色!

我想要不同状态的不同颜色,如果状态为启用,状态的不同颜色被禁用。

这是我的号码选择器代码:

<NumberPicker
android:id="@+id/NumberOfWebsitesPicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="0.75"
style="@style/MyStyle"
android:descendantFocusability="blocksDescendants"
android:scaleY="0.75" />

这是我的text_color.xml

Res->Color Direcoty

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#9D9FA2" />
<item android:state_enabled="true" android:color="#FAFAFA" />
</selector>

现在这是我的风格.xml

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorBackground</item>
<!--  It should be true otherwise action mode will not overlay toolbar -->
<item name="windowActionModeOverlay">true</item>
<!--  For Custom Action Mode Background Color/Drawable -->
<item name="actionModeBackground">@color/colorPrimary</item>
<item name="android:textColor">@color/text_color</item>
<item name="android:textColorPrimary">@color/text_color</item>
<item name="android:colorControlNormal">@color/divider_color</item>
<item name="android:divider">@color/divider_color</item>
<item name="android:textColorHint">@color/colorPrimary</item>
<item name="android:textSize">@dimen/font_size_14</item>
<item name="actionBarSize">56dp</item>
<item name="android:spinnerItemStyle">@style/Spinner_Item_Style</item>
<item name="android:spinnerDropDownItemStyle">@style/Spinner_DropDown_Item_Style</item>
<item name="android:dropDownListViewStyle">@style/SpinnerStyle</item>

</style>

<style name="Divider">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">2dp</item>
<item name="android:background">@color/divider_color</item>
</style>
<style name="DividerThin">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">2px</item>
<item name="android:background">@color/divider_color</item>
</style>
<style name="Vertical_divider" parent="DividerThin">
<item name="android:layout_width">2px</item>
<item name="android:background">@color/divider_color</item>
<item name="android:layout_height">match_parent</item>
</style>
<style name="Vertical_divider_thick" parent="Divider">
<item name="android:layout_width">2dp</item>
<item name="android:background">@color/divider_color</item>
<item name="android:layout_height">match_parent</item>
</style>

<style name="Spinner_Item_Style">
<item name="android:gravity">center</item>
<item name="android:textAlignment">center</item>
</style>
<style name="Spinner_DropDown_Item_Style" parent="Widget.AppCompat.ListView.DropDown">
<item name="android:gravity">center</item>
<item name="android:textAlignment">center</item>
<item name="android:paddingStart">@dimen/unit_8dp</item>
<item name="android:paddingEnd">@dimen/unit_8dp</item>
</style>
<style name="SpinnerStyle" parent="Widget.AppCompat.ListView.DropDown">
<item name="android:divider">@color/divider_color</item>
<item name="android:dividerHeight">1px</item>
</style>

<style name="MyStyle">
<item name="android:colorPrimary">@color/text_color</item>
</style>

</resources>

现在这里它只工作一次,下次禁用数字选择器时,它会保持其颜色为白色,并且不会随着选择器文件中声明的禁用颜色而改变颜色text_color。

我不明白为什么它只工作一次,

如果在创建视图上禁用了数字选择器,它将获得禁用状态的颜色 当我通过按下按钮手动禁用选择器时,它将文本的颜色更改为禁用的颜色,但是当我启用它时,它会采用启用颜色和更改值的颜色并再次禁用它,它不会转到禁用的颜色。

它只工作一次,并且在更改选取器的值后不起作用。

我使用以下代码修复了此问题:

fun setEnabledNumberPicker(numberPicker: NumberPicker, isEnable : Boolean) {
numberPicker.isEnabled = isEnable
val enablePickerColor = ContextCompat.getColor(requireContext(), R.color.textEnabled)
val disablePickerColor = ContextCompat.getColor(requireContext(), R.color.textDisabled)
try {
val selectorWheelPaintField: Field = numberPicker.javaClass
.getDeclaredField("mSelectorWheelPaint")
selectorWheelPaintField.isAccessible = true
if (isEnable)
(selectorWheelPaintField.get(numberPicker) as Paint).color = enablePickerColor
else
(selectorWheelPaintField.get(numberPicker) as Paint).color = disablePickerColor
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
} catch (e: IllegalArgumentException) {
e.printStackTrace()
}
val count = numberPicker.childCount
for (i in 0 until count) {
val child = numberPicker.getChildAt(i)
if (child is EditText) {
if (isEnable)
child.setTextColor(enablePickerColor)
else
child.setTextColor(disablePickerColor)
}
}
numberPicker.invalidate()
}

最新更新