Android学习之数字选择器NumberPicker之修改字色字号分割线颜色

今天讲下NumberPicker,其实NumberPicker是个很不完善的控件,许多我们认为谷歌肯定会提供的属性居然都没有,比如居然没有修改字体大小和字体颜色的属性,更别提修改分割线颜色了,关键系统提供的NumberPicker确实有点丑,所以大家都会想办法去修改NumverPicker,要么去自定义,要么去想办法修改那些不能修改的属性。今天就讲下如何修改NumberPicker的字色、字号和分割线颜色,还有如何禁止NumberPicker无限滚动,如何在NumberPicker中显示文本而非数字等。

通过自定义NumberPicker的方式可以修改字色和字号,话不多说,看代码:

/**
 * 改变文本样式的NumberPicker
 *
 * @author yuzhentao
 */
public class ChangeTextStyleNumberPicker extends NumberPicker {

    public ChangeTextStyleNumberPicker(Context context) {
        super(context);
    }

    public ChangeTextStyleNumberPicker(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChangeTextStyleNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void addView(View child) {
        super.addView(child);
        updateView(child);
    }

    @Override
    public void addView(View child, ViewGroup.LayoutParams params) {
        super.addView(child, params);
        updateView(child);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        updateView(child);
    }

    private void updateView(View view) {
        if (view instanceof EditText) {
            ((EditText) view).setTextColor(getResources().getColor(R.color.tc_change_text_style_number_picker));
            ((EditText) view).setTextSize(16);
        }
    }

}
所以,这样就能修改了,相信大家都看得懂。

还有一种方式也可以修改字色,方法就是通过Java的反射机制来得到修改字色的属性即可:

/**
 * 设置NumberPicker字色
 *
 * @param numberPicker:NumberPicker
 * @param color:int
 * @return boolean
 */
public static boolean setNumberPickerTextColor(NumberPicker numberPicker, int color) {
    final int count = numberPicker.getChildCount();
    for (int i = 0; i < count; i++) {
        View child = numberPicker.getChildAt(i);
        if (child instanceof EditText) {
            Field selectorWheelPaintField;
            try {
                selectorWheelPaintField = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
                selectorWheelPaintField.setAccessible(true);
                try {
                    ((Paint) selectorWheelPaintField.get(numberPicker)).setColor(color);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((EditText) child).setTextColor(color);
                numberPicker.invalidate();
                return true;
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }
    return false;
}
至于反射怎么用网上有很多种方法,这里不细述,那么如何修改分割线的颜色呢?同样我们可以通过反射来完成:

/**
 * 设置NumberPicker分割线颜色
 *
 * @param numberPicker:NumberPicker
 * @param color:int
 */
public static void setNumberPickerDividerColor(NumberPicker numberPicker, int color) {
    Field[] pickerFields = NumberPicker.class.getDeclaredFields();
    for (Field SelectionDividerField : pickerFields) {
        if (SelectionDividerField.getName().equals("mSelectionDivider")) {
            SelectionDividerField.setAccessible(true);
            try {
                SelectionDividerField.set(numberPicker, new ColorDrawable(color));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            break;
        }
    }
}
好,那么如何防止NumberPicker无限滚动呢?这个就很简单啦,一行代码搞定:

npQuery.setWrapSelectorWheel(false);
最后,如何在NumberPicker中显示文本而非数字呢?也是很简单:

npQuery.setDisplayedValues(string);
npQuery.setMinValue(0);
npQuery.setMaxValue(string.length - 1);
记住,setWrapSelectorWheel()必须用在上面的代码之下。

实际效果图木有。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值