前言
在项目中需要一个选择人数的控件,于是想到了NumberPicker,这个控件相对不是那么热门,我也是第一次用,所以遇到了一些问题,这里做个小结。
正文
首先来看一下最终的效果:
需求其实很简单,就是弹个Dialog,然后选数字,点确定。Dialog和这几个Button我就不多说了,主要来讲讲怎么使用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不可编辑:
//设置不可编辑
numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
这样基本就能用了,现在我们需要对它设置监听,来拿到选择结果:
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
//得到选择结果
}
});
接下来的操作可能就稍微显得麻烦一点了,我们先来看看如何设置分割线的颜色,这里我们采用的是反射的方式:
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);
}
}
}
结语
好了,关于NumberPicker的基本用法和常见问题就介绍到这里,希望对大家有所帮助。如有问题,欢迎指正。