我是靠谱客的博主 愤怒树叶,最近开发中收集的这篇文章主要介绍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()必须用在上面的代码之下。

实际效果图木有。

最后

以上就是愤怒树叶为你收集整理的Android学习之数字选择器NumberPicker之修改字色字号分割线颜色的全部内容,希望文章能够帮你解决Android学习之数字选择器NumberPicker之修改字色字号分割线颜色所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部