【问题标题】:Change Text Color of Number Picker via State Selector通过状态选择器更改数字选择器的文本颜色
【发布时间】:2018-06-16 18:25:27
【问题描述】:

我正在尝试更改 NumberPicker 的文本颜色!

如果状态启用并且状态的不同颜色被禁用,我希望在不同的状态下使用不同的颜色。

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

 <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->颜色方向

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

现在这是我的 style.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>

现在这里它只运行一次很好,下次禁用 Number Picker 时,它会保持其颜色为白色,并且不会使用 text_color 选择器文件中声明的禁用颜色改变颜色。

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

如果 Numberpicker 在 CreateView 上被禁用,它会获得禁用状态的颜色 当我通过按下按钮手动禁用选择器时,它会将文本颜色更改为禁用颜色,但是当我启用它时,它会采用启用颜色的颜色并更改值并再次禁用它,它不会变为禁用颜色。

它只工作一次,改变选择器的值后不起作用。

【问题讨论】:

    标签: android styles textcolor android-number-picker


    【解决方案1】:

    我使用以下代码解决了这个问题:

    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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 2019-07-10
      • 2016-02-12
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      相关资源
      最近更新 更多