因Android自带的NumberPicker不支持直接设置分割线的颜色和字体颜色,因此: java
public class QNumberPicker extends NumberPicker { public QNumberPicker(Context context) { super(context); } public QNumberPicker(Context context, AttributeSet attrs) { super(context, attrs); } public QNumberPicker(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, int index, android.view.ViewGroup.LayoutParams params) { super.addView(child, index, params); updateView(child); } @Override public void addView(View child, android.view.ViewGroup.LayoutParams params) { super.addView(child, params); updateView(child); } public void updateView(View view) { if (view instanceof EditText) { //这里修改字体的属性 ((EditText) view).setTextColor(Color.parseColor("#BAA785")); // ((EditText) view).setTextSize(); } } }继承和重写NumberPicker,在xml中使用修改过的NumberPicker
<com.xx.xx.test.QNumberPicker android:layout_width="90dp" android:layout_height="wrap_content"/>
private void setNumberPickerDividerColor(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, new ColorDrawable(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后调用) android
DatePicker和NumberPicker设置分割线颜色差很少,只是须要先拿到外面的LinearLayout json
private void setDatePickerDividerColor(DatePicker datePicker){ // Divider changing: // 获取 mSpinners LinearLayout llFirst = (LinearLayout) datePicker.getChildAt(0); // 获取 NumberPicker LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0); for (int i = 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, new ColorDrawable(this.getResources().getColor(R.color.green))); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } } }
那这些修改有什么用呢?能够只用NumberPicker作一个流畅的省市区联动,而不用去关联library了。修改NumberPicker分割线颜色为透明(我这用的是黑色,但透明的分割线体验更好),将三个NumberPicker并排平分宽度放在一个PopupWindow中或者随便放在哪,第一个为省,第二个为市,第三个为区 数组
用如下代码关掉编辑模式,否则Picker上会有光标和软键盘弹出来 服务器
mProvince.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
网上不少都是存在本地的xml或者json文件来存,因项目中实际为三个请求来获取服务器上的省市区,不能用本地数据,因此视图加载的时候首先获取省,setDisplayedValues显示出来,再经过给省和市设置的OnValueChangedListener,拿到里面的newVal,根据这个在省数组中的位置来动态请求相应数据来设置市、区。下面是实际效果(oschina有上传大小限制,压缩后有水印,凑合看吧) ide
那么非要用本地省市区数据呢?更简单了,视图加载的时候把省市区从本地文件中读取出来存到三个String数组里,全setDisplayedValues就完了,都用不到OnValueChangedListener。获取Picker的值用getValue就能够了 字体