Android 原生NumberPicker控件修改分割線顏色及字體顏色大小(附:省市區聯動)

因Android自帶的NumberPicker不支持直接設置分割線的顏色和字體顏色,因此: java

一、NumberPicker字體顏色:

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"/>

二、NumberPicker分割線顏色

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的分割線顏色

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 省市區聯動

那這些修改有什麼用呢?能夠只用NumberPicker作一個流暢的省市區聯動,而不用去關聯library了。修改NumberPicker分割線顏色爲透明(我這用的是黑色,但透明的分割線體驗更好),將三個NumberPicker並排平分寬度放在一個PopupWindow中或者隨便放在哪,第一個爲省,第二個爲市,第三個爲區 數組

用如下代碼關掉編輯模式,否則Picker上會有光標和軟鍵盤彈出來 服務器

mProvince.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

網上不少都是存在本地的xml或者json文件來存,因項目中實際爲三個請求來獲取服務器上的省市區,不能用本地數據,因此視圖加載的時候首先獲取省,setDisplayedValues顯示出來,再經過給省和市設置的OnValueChangedListener,拿到裏面的newVal,根據這個在省數組中的位置來動態請求相應數據來設置市、區。下面是實際效果(oschina有上傳大小限制,壓縮後有水印,湊合看吧) ide

那麼非要用本地省市區數據呢?更簡單了,視圖加載的時候把省市區從本地文件中讀取出來存到三個String數組裏,全setDisplayedValues就完了,都用不到OnValueChangedListener。獲取Picker的值用getValue就能夠了 字體

相關文章
相關標籤/搜索