您的位置:首页 > 移动开发 > Android开发

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

2016-03-17 21:24 671 查看
今天讲下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()必须用在上面的代码之下。

实际效果图木有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: