日期/時(shí)間選擇器的簡(jiǎn)單使用

如果想要實(shí)現(xiàn)日期/時(shí)間選擇器的需求,其實(shí)在安卓原生的控件中就已經(jīng)提供好了。TimePicker和DatePicker题诵。直接作用在xml文件中就可以看到效果(依據(jù)api不同會(huì)有不同的樣式)渣淳,但是有時(shí)候還需要將TimePicker和DatePicker連用放到同一個(gè)布局中,接下來(lái)可以來(lái)看下效果肥印。


模擬器(api19)
真機(jī)(api24)
  1. 首先記錄一下DatePickerDialog/TimePickerDialog的使用识椰,結(jié)構(gòu)上它們都是繼承自AlertDialog的。
    /**
     * 日期選擇
     *
     * @param activity
     * @param themeResId
     * @param tv
     * @param calendar
     */
    public static void showDatePickerDialog(Activity activity, int themeResId, final TextView tv, Calendar calendar) {
        // 直接創(chuàng)建一個(gè)DatePickerDialog對(duì)話(huà)框?qū)嵗罴睿⑺@示出來(lái)
        new DatePickerDialog(activity, themeResId, new DatePickerDialog.OnDateSetListener() {
            // 綁定監(jiān)聽(tīng)器(How the parent is notified that the date is set.)
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                // 此處得到選擇的時(shí)間腹鹉,可以進(jìn)行你想要的操作
                tv.setText("您選擇了:" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日");

            }
        }
                // 設(shè)置初始日期
                , calendar.get(Calendar.YEAR)
                , calendar.get(Calendar.MONTH)
                , calendar.get(Calendar.DAY_OF_MONTH)
        ).show();
    }

這里其實(shí)是將DatePickerDialog封裝了一下,在使用時(shí)themeResId會(huì)改變展示的效果敷硅,如果想要一個(gè)可以上下滾動(dòng)來(lái)選擇日期而不是直接使用日歷的方式來(lái)選擇功咒,保險(xiǎn)點(diǎn)的方式可以直接賦值為3。同時(shí)要需要傳入年月日這三個(gè)參數(shù)作為該日期選擇器一點(diǎn)開(kāi)默認(rèn)的日期绞蹦,可以傳遞你實(shí)際需求的日期也可以傳入當(dāng)前實(shí)際日期力奋,這里使用Calendar類(lèi)來(lái)獲取當(dāng)前系統(tǒng)日期。通過(guò)一個(gè)回調(diào)方法將選中的年月日賦值到控件上幽七。

    /**
     * 時(shí)間選擇
     *
     * @param activity
     * @param themeResId
     * @param tv
     * @param calendar
     */
    public static void showTimePickerDialog(Activity activity, int themeResId, final TextView tv, Calendar calendar) {
        // Calendar c = Calendar.getInstance();
        // 創(chuàng)建一個(gè)TimePickerDialog實(shí)例景殷,并把它顯示出來(lái)
        new TimePickerDialog(activity, themeResId,
                // 綁定監(jiān)聽(tīng)器
                new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        tv.setText("您選擇了:" + hourOfDay + "時(shí)" + minute + "分");
                    }
                }
                // 設(shè)置初始時(shí)間
                , calendar.get(Calendar.HOUR_OF_DAY)
                , calendar.get(Calendar.MINUTE)
                // true表示采用24小時(shí)制
                , true).show();
    }

TimePickerDialog也是同樣的用法,注意TimePicker需要多設(shè)置一個(gè)是否12/24小時(shí)制。

  1. 接下來(lái)使用DatePicker和TimePicker來(lái)組合實(shí)現(xiàn)日期/時(shí)間選擇
  /**
     * 得到時(shí)間的view
     *
     * @param
     * @return
     */

    public void getDefDialog(Context ctx, final TextView textview) {

        final Dialog dialog = new Dialog(ctx, R.style.smart_dialog);

        View view = View.inflate(ctx, R.layout.view_def_date_dialog, null);
        DatePicker dp_date = (DatePicker) view.findViewById(R.id.dp_date);
        TimePicker tp_time = (TimePicker) view.findViewById(R.id.tp_time);
//        dp_date.setCalendarViewShown(false);

        final TextView tv_date = (TextView) view.findViewById(R.id.tv_date);
        final TextView tv_time = (TextView) view.findViewById(R.id.tv_time);

        LinearLayout ll_nowTime = (LinearLayout) view.findViewById(R.id.ll_nowTime);
        final TextView tv_nowTime = (TextView) view.findViewById(R.id.tv_nowdate);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        final String nowTime = simpleDateFormat.format(new Date());
//        tv_nowTime.setText(nowTime);




        ll_nowTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textview.setText(nowTime);
                dialog.dismiss();
            }
        });

        Button btn_dialog_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel);
        Button btn_dialog_ok = (Button) view.findViewById(R.id.btn_dialog_ok);


        tp_time.setIs24HourView(true);


        final int years = dp_date.getYear();
        final int monthOfYears = dp_date.getMonth();
        final int dayOfMonths = dp_date.getDayOfMonth();

        tv_date.setText(years + "-" + (monthOfYears + 1) + "-" + dayOfMonths);

        dp_date.init(years, monthOfYears, dayOfMonths, new DatePicker.OnDateChangedListener() {
                    @Override
                    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                        tv_date.setText(year + "-" + (monthOfYear + 1) + "-" + dayOfMonth);
                    }
                });


        //使用Calendar類(lèi)通過(guò)設(shè)置時(shí)區(qū)的方式拿到正確的時(shí)刻
        Calendar calendar = Calendar.getInstance();
        //設(shè)置時(shí)區(qū)
        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        int Hour = calendar.get(Calendar.HOUR_OF_DAY);
        int Minute = calendar.get(Calendar.MINUTE);

        tv_time.setText(Hour + ":" + Minute);
        //設(shè)置時(shí)間選擇器上的默認(rèn)時(shí)間
        tp_time.setCurrentHour(Hour);
        tp_time.setCurrentMinute(Minute);



        tp_time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                tv_time.setText(hourOfDay + ":" + minute);
            }
        });

        btn_dialog_cancel.setOnTouchListener(new ButtonTouchListener(ctx, btn_dialog_cancel));
        btn_dialog_ok.setOnTouchListener(new ButtonTouchListener(ctx, btn_dialog_ok));

        btn_dialog_cancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // 點(diǎn)擊取消時(shí)應(yīng)該把選擇器上的時(shí)間重置

                dialog.dismiss();
            }
        });

        btn_dialog_ok.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                CharSequence date = tv_date.getText();
                CharSequence time = tv_time.getText();
                // 將時(shí)間格式統(tǒng)一 例如 2017-08-01 03:07:00
                String dates = date + "";
                String times = time + "";
                String[] datess = dates.split("-");
                if (datess[1].length() < 2) {
                    datess[1] = "0" + datess[1];
                }
                if (datess[2].length() < 2) {
                    datess[2] = "0" + datess[2];
                }
                String datesss = datess[0] + "-" + datess[1] + "-" + datess[2];
                String[] timess = times.split(":");
                if (timess[0].length() < 2) {
                    timess[0] = "0" + timess[0];
                }
                if (timess[1].length() < 2) {
                    timess[1] = "0" + timess[1];
                }
                String timesss = timess[0] + ":" + timess[1];
                // String date_time = date + " " + time + ":00";
                String date_time = datesss + " " + timesss + ":00";
                textview.setText(date_time);

                dialog.dismiss();
            }
        });

        dialog.setContentView(view);
        // 如果要去掉這個(gè)代碼,就得添加cancel監(jiān)聽(tīng)
        dialog.setCancelable(false);
        dialog.show();
    }

這段代碼主要有兩部分乌奇,初始化設(shè)置和取到時(shí)間后對(duì)字符串進(jìn)行處理。注意在拿到month后還要對(duì)其+1因?yàn)閙onth值是從0開(kāi)始計(jì)數(shù)的绩蜻。取到時(shí)間后主要是通過(guò)對(duì)字符串截取判斷每一部分的字符數(shù)組是否符合格式要求并進(jìn)行處理。

  1. 遇到的問(wèn)題
  • 自己的電腦好像環(huán)境變量有點(diǎn)問(wèn)題室埋,導(dǎo)致拿到的系統(tǒng)時(shí)間永遠(yuǎn)是格林威治時(shí)間(也就是慢了8個(gè)小時(shí))办绝,可以通過(guò)對(duì)Calendar類(lèi)或者SimpleDateFormat類(lèi)設(shè)置時(shí)區(qū)就可以拿到正確的時(shí)間了
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd  kk:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        Toast.makeText(MyApplication.context, sdf.format(new Date()), Toast.LENGTH_SHORT).show();
//        或
        Calendar now = Calendar.getInstance();
        now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        System.out.println(now.get(Calendar.HOUR_OF_DAY));
        System.out.println(now.get(Calendar.MINUTE));
        System.out.println(now.get(Calendar.SECOND));
  • 在api21以上的機(jī)器中樣式會(huì)改變?yōu)槿諝v的形式來(lái)選擇日期。所以可以在xml代碼中增加如下配置姚淆,就可以將日歷改為上下滾動(dòng)來(lái)選擇日期了孕蝉。
    DatePicker
            android:datePickerMode="spinner"
            android:calendarViewShown="false" 

TimePicker

            android:timePickerMode="spinner"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肉盹,隨后出現(xiàn)的幾起案子昔驱,更是在濱河造成了極大的恐慌,老刑警劉巖上忍,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骤肛,死亡現(xiàn)場(chǎng)離奇詭異纳本,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)腋颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)繁成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淑玫,你說(shuō)我怎么就攤上這事巾腕。” “怎么了絮蒿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵尊搬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我土涝,道長(zhǎng)佛寿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任但壮,我火速辦了婚禮冀泻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜡饵。我一直安慰自己弹渔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布溯祸。 她就那樣靜靜地躺著肢专,像睡著了一般。 火紅的嫁衣襯著肌膚如雪您没。 梳的紋絲不亂的頭發(fā)上鸟召,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音氨鹏,去河邊找鬼。 笑死压状,一個(gè)胖子當(dāng)著我的面吹牛仆抵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播种冬,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼镣丑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了娱两?” 一聲冷哼從身側(cè)響起莺匠,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎十兢,沒(méi)想到半個(gè)月后趣竣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摇庙,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年遥缕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卫袒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单匣,死狀恐怖夕凝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情户秤,我是刑警寧澤码秉,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸡号,受9級(jí)特大地震影響泡徙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膜蠢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一堪藐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挑围,春花似錦礁竞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜘矢,卻和暖如春狂男,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背品腹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工岖食, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舞吭。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓泡垃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親羡鸥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔑穴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355