1. 程式人生 > >Android學習之數字選擇器NumberPicker之修改字色字號分割線顏色

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()必須用在上面的程式碼之下。

實際效果圖木有。