Android NumberPicker的基本用法及常見問題匯總

前言

在項目中需要一個選擇圖片中數(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ā)備忘

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俏讹,一起剝皮案震驚了整個濱河市当宴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泽疆,老刑警劉巖户矢,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殉疼,居然都是意外死亡梯浪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門瓢娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挂洛,“玉大人,你說我怎么就攤上這事眠砾÷簿ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵褒颈,是天一觀的道長柒巫。 經(jīng)常有香客問我,道長哈肖,這世上最難降的妖魔是什么吻育? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淤井,結(jié)果婚禮上布疼,老公的妹妹穿的比我還像新娘摊趾。我一直安慰自己,他們只是感情好游两,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布砾层。 她就那樣靜靜地躺著,像睡著了一般贱案。 火紅的嫁衣襯著肌膚如雪肛炮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天宝踪,我揣著相機與錄音侨糟,去河邊找鬼。 笑死瘩燥,一個胖子當著我的面吹牛秕重,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厉膀,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼溶耘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了服鹅?” 一聲冷哼從身側(cè)響起凳兵,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎企软,沒想到半個月后庐扫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡澜倦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年聚蝶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藻治。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡碘勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桩卵,到底是詐尸還是另有隱情验靡,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布雏节,位于F島的核電站胜嗓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钩乍。R本人自食惡果不足惜辞州,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寥粹。 院中可真熱鬧变过,春花似錦埃元、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崭孤,卻和暖如春类嗤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辨宠。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工遗锣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彭羹。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓黄伊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親派殷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容