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

前言

在项目中需要一个选择图片中数字的控件,于是想到了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);
        }
    }
}

以上内容仅用作作者开发备忘

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容