前言
在项目中需要一个选择图片中数字的控件,于是想到了NumberPicker,这个控件相对不是那么热门,我也是第一次用,所以遇到了一些问题,这里做个小结。
主要来讲讲怎么使用NumberPicker,主要包含以下几点:
- 设置内容
- 设置循环状态
- 设置不可编辑
- 设置监听
- 设置滑动状态监听
- 设置分割线颜色
- 设置字体颜色和大小
首先设置内容这块,如果只设置了最大最小值,那么只显示数字,如果想要显示字符串,需要自己定义一个数组,以上面的效果为例,由于显示内容中有一个“10+”,所以我们不能只单纯显示数字,得自己定义一个数组:
private String[] numbers = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "10+"};
//设置需要显示的内容数组
numberPicker.setDisplayedValues(numbers);
//设置最大最小值
numberPicker.setMinValue(1);
numberPicker.setMaxValue(numbers.length);
//设置默认的位置
numberPicker.setValue(1);
设置是否循环显示,注意setWrapSelectorWheel方法须在上面的代码之后调用才会生效:
//这里设置为不循环显示,默认值为true
numberPicker.setWrapSelectorWheel(false);
NumberPicker设置不可编辑:
//设置不可编辑
numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
监听获取结果值
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();
}
});
滑动监听
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:
//飞滚状态
Log.i(TAG, "onScrollStateChange: 当前状态"+value+"SCROLL_STATE_FLING");
break;
case SCROLL_STATE_IDLE:
//滚动停止状态
Log.i(TAG, "onScrollStateChange: 当前状态"+value+"SCROLL_STATE_IDLE");
break;
case SCROLL_STATE_TOUCH_SCROLL:
//按下滚动状态
Log.i(TAG, "onScrollStateChange: 当前状态"+value+"SCROLL_STATE_TOUCH_SCROLL");
break;
}
}
};
接下来 我们先来看看如何设置分割线的颜色,这里我们采用的是反射的方式:
private void setNumberPickerDividerColor(NumberPicker numberPicker) {
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try {
//设置分割线的颜色值
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) {
//设置文字的颜色和大小
((EditText) view).setTextColor(getResources().getColor(R.color.black));
((EditText) view).setTextSize(16);
}
}
}
以上内容仅用作作者开发备忘