前言
在項(xiàng)目中需要一個(gè)選擇人數(shù)的控件,于是想到了NumberPicker簿寂,這個(gè)控件相對(duì)不是那么熱門(mén),我也是第一次用宿亡,所以遇到了一些問(wèn)題常遂,這里做個(gè)小結(jié)。
正文
首先來(lái)看一下最終的效果:
需求其實(shí)很簡(jiǎn)單她混,就是彈個(gè)Dialog烈钞,然后選數(shù)字,點(diǎn)確定坤按。Dialog和這幾個(gè)Button我就不多說(shuō)了毯欣,主要來(lái)講講怎么使用NumberPicker,主要包含以下幾點(diǎn):
- 設(shè)置內(nèi)容
- 設(shè)置循環(huán)狀態(tài)
- 設(shè)置不可編輯
- 設(shè)置監(jiān)聽(tīng)
- 設(shè)置分割線(xiàn)顏色
- 設(shè)置字體顏色和大小
首先設(shè)置內(nèi)容這塊臭脓,如果只設(shè)置了最大最小值酗钞,那么只顯示數(shù)字,如果想要顯示字符串,需要自己定義一個(gè)數(shù)組砚作,以上面的效果為例窘奏,由于顯示內(nèi)容中有一個(gè)“10+”,所以我們不能只單純顯示數(shù)字葫录,得自己定義一個(gè)數(shù)組:
private String[] numbers = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "10+"};
//設(shè)置需要顯示的內(nèi)容數(shù)組
numberPicker.setDisplayedValues(numbers);
//設(shè)置最大最小值
numberPicker.setMinValue(1);
numberPicker.setMaxValue(numbers.length);
//設(shè)置默認(rèn)的位置
numberPicker.setValue(1);
設(shè)置是否循環(huán)顯示着裹,注意setWrapSelectorWheel方法須在上面的代碼之后調(diào)用才會(huì)生效:
//這里設(shè)置為不循環(huán)顯示,默認(rèn)值為true
numberPicker.setWrapSelectorWheel(false);
NumberPicker默認(rèn)點(diǎn)擊是可以編輯的米同,就像這樣:
所以我們需要加上一行代碼骇扇,來(lái)使得NumberPicker不可編輯:
//設(shè)置不可編輯
numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
這樣基本就能用了,現(xiàn)在我們需要對(duì)它設(shè)置監(jiān)聽(tīng)面粮,來(lái)拿到選擇結(jié)果:
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
//得到選擇結(jié)果
}
});
接下來(lái)的操作可能就稍微顯得麻煩一點(diǎn)了少孝,我們先來(lái)看看如何設(shè)置分割線(xiàn)的顏色,這里我們采用的是反射的方式:
private void setNumberPickerDividerColor(NumberPicker numberPicker) {
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try {
//設(shè)置分割線(xiàn)的顏色值
pf.set(numberPicker, new ColorDrawable(getResources().getColor(R.color.numberpicker_divider_color)));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
最后我們來(lái)看看如何修改字體顏色和大小熬苍,新建一個(gè)類(lèi)繼承NumberPicker:
public class TextConfigNumberPicker extends NumberPicker {
public TextConfigNumberPicker(Context context) {
super(context);
}
public TextConfigNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextConfigNumberPicker(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) {
//設(shè)置文字的顏色和大小
((EditText) view).setTextColor(getResources().getColor(R.color.black));
((EditText) view).setTextSize(16);
}
}
}
結(jié)語(yǔ)
好了稍走,關(guān)于NumberPicker的基本用法和常見(jiàn)問(wèn)題就介紹到這里,希望對(duì)大家有所幫助柴底。如有問(wèn)題婿脸,歡迎指正。