因Android自带的NumberPicker不支持直接设置分割线的颜色和字体颜色,所以:
1、NumberPicker字体颜色:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
publicclassQNumberPickerextendsNumberPicker {
publicQNumberPicker(Context context) {
super(context);
}
publicQNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
publicQNumberPicker(Context context, AttributeSet attrs,intdefStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
publicvoidaddView(View child) {
super.addView(child);
updateView(child);
}
@Override
publicvoidaddView(View child,intindex,
android.view.ViewGroup.LayoutParams params) {
super.addView(child, index, params);
updateView(child);
}
@Override
publicvoidaddView(View child, android.view.ViewGroup.LayoutParams params) {
super.addView(child, params);
updateView(child);
}
publicvoidupdateView(View view) {
if(viewinstanceofEditText) {
//这里修改字体的属性
((EditText) view).setTextColor(Color.parseColor("#BAA785"));
// ((EditText) view).setTextSize();
}
}
}
|
1
2
3
|
<com.xx.xx.test.QNumberPicker
android:layout_width="90dp"
android:layout_height="wrap_content"/>
|
2、NumberPicker分割线颜色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
privatevoidsetNumberPickerDividerColor(NumberPicker numberPicker) {
NumberPicker picker = numberPicker;
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for(Field pf : pickerFields) {
if(pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try{
//设置分割线的颜色值
pf.set(picker,newColorDrawable(this.getResources().getColor(R.color.green)));
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(Resources.NotFoundException e) {
e.printStackTrace();
}catch(IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
|
这个方法是通过反射拿到mSelectionDivider属性,然后给他设置上颜色值。(此方法在NumberPicker 的 setDisplayedValues后调用)
补充: DatePicker的分割线颜色
DatePicker和NumberPicker设置分割线颜色差不多,只是需要先拿到外面的LinearLayout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
privatevoidsetDatePickerDividerColor(DatePicker datePicker){
// Divider changing:
// 获取 mSpinners
LinearLayout llFirst = (LinearLayout) datePicker.getChildAt(0);
// 获取 NumberPicker
LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);
for(inti =0; i < mSpinners.getChildCount(); i++) {
NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for(Field pf : pickerFields) {
if(pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try{
pf.set(picker,newColorDrawable(this.getResources().getColor(R.color.green)));
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(NotFoundException e) {
e.printStackTrace();
}catch(IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
}
|
附:NumberPicker 省市区联动
那这些修改有什么用呢?可以只用NumberPicker做一个流畅的省市区联动,而不用去关联library了。修改NumberPicker分割线颜色为透明(我这用的是黑色,但透明的分割线体验更好),将三个NumberPicker并排平分宽度放在一个PopupWindow中或者随便放在哪,第一个为省,第二个为市,第三个为区
用以下代码关掉编辑模式,不然Picker上会有光标和软键盘弹出来
1
|
mProvince.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
|
网上很多都是存在本地的xml或者json文件来存,因项目中实际为三个请求来获取服务器上的省市区,不能用本地数据,所以视图加载的时候首先获取省,setDisplayedValues显示出来,再通过给省和市设置的OnValueChangedListener,拿到里面的newVal,根据这个在省数组中的位置来动态请求相应数据来设置市、区。下面是实际效果(oschina有上传大小限制,压缩后有水印,凑合看吧)
那么非要用本地省市区数据呢?更简单了,视图加载的时候把省市区从本地文件中读取出来存到三个String数组里,全setDisplayedValues就完了,都用不到OnValueChangedListener。获取Picker的值用getValue就可以了