Osheep

时光不回头,当下最重要。

Android NumberPicker的基本用法及常见问题汇总

前言

在项目中需要一个选择人数的控件,于是想到了NumberPicker,这个控件相对不是那么热门,我也是第一次用,所以遇到了一些问题,这里做个小结。

正文

首先来看一下最终的效果:

《Android NumberPicker的基本用法及常见问题汇总》

NumberPicker.png

需求其实很简单,就是弹个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默认点击是可以编辑的,就像这样:

《Android NumberPicker的基本用法及常见问题汇总》

可编辑状态.png

所以我们需要加上一行代码,来使得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的基本用法和常见问题就介绍到这里,希望对大家有所帮助。如有问题,欢迎指正。

点赞