因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就能夠了 字體