前言
在項目中需要一個選擇圖片中數(shù)字的控件,于是想到了NumberPicker拆魏,這個控件相對不是那么熱門盯桦,我也是第一次用慈俯,所以遇到了一些問題,這里做個小結(jié)拥峦。
主要來講講怎么使用NumberPicker贴膘,主要包含以下幾點:
- 設(shè)置內(nèi)容
- 設(shè)置循環(huán)狀態(tài)
- 設(shè)置不可編輯
- 設(shè)置監(jiān)聽
- 設(shè)置滑動狀態(tài)監(jiān)聽
- 設(shè)置分割線顏色
- 設(shè)置字體顏色和大小
首先設(shè)置內(nèi)容這塊,如果只設(shè)置了最大最小值事镣,那么只顯示數(shù)字步鉴,如果想要顯示字符串,需要自己定義一個數(shù)組璃哟,以上面的效果為例,由于顯示內(nèi)容中有一個“10+”喊递,所以我們不能只單純顯示數(shù)字随闪,得自己定義一個數(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è)置默認的位置
numberPicker.setValue(1);
設(shè)置是否循環(huán)顯示,注意setWrapSelectorWheel方法須在上面的代碼之后調(diào)用才會生效:
//這里設(shè)置為不循環(huán)顯示骚勘,默認值為true
numberPicker.setWrapSelectorWheel(false);
NumberPicker設(shè)置不可編輯:
//設(shè)置不可編輯
numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
監(jiān)聽獲取結(jié)果值
binding.picker1.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
Toast.makeText(MainActivity.this,"當前值"+newVal+" " +
" 上一個值"+oldVal,Toast.LENGTH_SHORT).show();
}
});
滑動監(jiān)聽
private NumberPicker.OnScrollListener mScrollListener=new NumberPicker.OnScrollListener() {
@Override
public void onScrollStateChange(NumberPicker view, int scrollState) {
int value = view.getValue();
switch (scrollState) {
case SCROLL_STATE_FLING:
//飛滾狀態(tài)
Log.i(TAG, "onScrollStateChange: 當前狀態(tài)"+value+"SCROLL_STATE_FLING");
break;
case SCROLL_STATE_IDLE:
//滾動停止狀態(tài)
Log.i(TAG, "onScrollStateChange: 當前狀態(tài)"+value+"SCROLL_STATE_IDLE");
break;
case SCROLL_STATE_TOUCH_SCROLL:
//按下滾動狀態(tài)
Log.i(TAG, "onScrollStateChange: 當前狀態(tài)"+value+"SCROLL_STATE_TOUCH_SCROLL");
break;
}
}
};
接下來 我們先來看看如何設(shè)置分割線的顏色铐伴,這里我們采用的是反射的方式:
private void setNumberPickerDividerColor(NumberPicker numberPicker) {
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try {
//設(shè)置分割線的顏色值
pf.set(numberPicker, new ColorDrawable(getResources().getColor(R.color.numberpicker_divider_color)));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
如何修改字體顏色和大小,新建一個類繼承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);
}
}
}
以上內(nèi)容僅用作作者開發(fā)備忘