Android學習之數字選擇器NumberPicker之修改字色字號分割線顏色
阿新 • • 發佈:2019-01-06
今天講下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()必須用在上面的程式碼之下。
實際效果圖木有。