今天讲下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()必须用在上面的代码之下。
实际效果图木有。