Android DatePicker

前言

話說(shuō)日期時(shí)間選擇控件許多項(xiàng)目都會(huì)用到谆棺,今天小可不才疚沐,也發(fā)一個(gè)自己寫的日期選擇控件

先上圖

CC8V2$(JPZ`{WT42ICK7F}K.png
demo.gif

1暂氯、首先自定義日期選擇工具類

里面注釋比較詳細(xì),我就不在這里一一贅述了亮蛔。

  /**
    * 日期時(shí)間選擇控件 使用方法: private EditText inputDate;<br>
    * 需要設(shè)置的日期時(shí)間文本編輯框 private String initDateTime="2012年9月3  日 14:44",初始日期時(shí)間值
    * 在點(diǎn)擊事件中使用: inputDate.setOnClickListener(new OnClickListener()     
    */
  public class DatePickerDialogUtil implements OnDateChangedListener,
    OnTimeChangedListener {
/** 日期選擇 */
private DatePicker mDateChoose;
/** 時(shí)間選擇 */
private TimePicker mTimeChoose;
/** 對(duì)話框 */
private AlertDialog mDialog;
/** 設(shè)置時(shí)間 */
private String mDateTime;
/** 初始化時(shí)間 */
private String mInitDateTime;
private final SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy年MM月dd日 HH:mm:ss");
/** 顯示時(shí)間 */
private String showDate;
/** Activity對(duì)象 */
private final Activity mActivity;

/**
 * 日期時(shí)間彈出選擇框函數(shù)
 * 
 * @param activity
 *            調(diào)用父Activity
 * @param dateTime
 *            初始日期時(shí)間值痴施,作為彈出窗口的標(biāo)題和日期時(shí)間初始值
 */

public DatePickerDialogUtil(Activity activity, String dateTime) {
    this.mActivity = activity;
    this.mInitDateTime = dateTime;
}

/**
 * 初始化時(shí)間日期
 * 
 * @param datePicker
 *            日期
 * @param timePicker
 *            時(shí)間
 */
public void init(DatePicker datePicker, TimePicker timePicker) {
    // 初始化Calendar
    Calendar calendar = Calendar.getInstance();
    // datePicker不等于空,并且初始化時(shí)間不為空
    if (!(datePicker == null || "".equals(mInitDateTime))) {

    } else {
        mInitDateTime = calendar.get(Calendar.YEAR) + "年"
                + calendar.get(Calendar.MONTH) + "月"
                + calendar.get(Calendar.DAY_OF_MONTH) + "日"
                + calendar.get(Calendar.HOUR_OF_DAY) + ":"
                + calendar.get(Calendar.MINUTE);
    }
    // 初始化時(shí)間
    mDateChoose.init(calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH), this);
    // 設(shè)置當(dāng)前時(shí)間
    mTimeChoose.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
    // 設(shè)置當(dāng)前分鐘
    mTimeChoose.setCurrentMinute(calendar.get(Calendar.MINUTE));
}

/**
 * 彈出日期時(shí)間選擇框方法
 * 
 * @param dateText
 *            需要設(shè)置的日期時(shí)間選擇框
 * @return
 */
public AlertDialog datePickerDialog(final Button dateText) {
    LinearLayout mInflater = (LinearLayout) mActivity.getLayoutInflater()
            .inflate(R.layout.datepicker_dialog, null);
    mDateChoose = (DatePicker) mInflater.findViewById(R.id.date_choose);
    mTimeChoose = (TimePicker) mInflater.findViewById(R.id.time_choose);
    // 初始化日期時(shí)間
    init(mDateChoose, mTimeChoose);
    // 設(shè)置日期為24小時(shí)制
    mTimeChoose.setIs24HourView(true);
    // 時(shí)間改變事件監(jiān)聽(tīng)器
    mTimeChoose.setOnTimeChangedListener(this);
    showDate = sdf.format(System.currentTimeMillis());
    // 創(chuàng)建對(duì)話框
    mDialog = new AlertDialog.Builder(mActivity).setTitle(mInitDateTime)
            .setView(mInflater)
            .setPositiveButton("設(shè)置", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dateText.setText(mDateTime);
                }
            }).setNegativeButton("取消", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dateText.setText(showDate);
                }
            }).show();
    // 設(shè)置日期改變
    onDateChanged(null, 0, 0, 0);
    return mDialog;
}

/**
 * 時(shí)間監(jiān)聽(tīng)器
 */
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    // 設(shè)置日期改變
    onDateChanged(null, 0, 0, 0);
}

/**
 * 日期監(jiān)聽(tīng)器
 */
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
        int dayOfMonth) {
    // 獲取日歷實(shí)例
    Calendar calendar = Calendar.getInstance();
    // 設(shè)置當(dāng)前日期和時(shí)間
    calendar.set(mDateChoose.getYear(), mDateChoose.getMonth(),
            mDateChoose.getDayOfMonth(), mTimeChoose.getCurrentHour(),
            mTimeChoose.getCurrentMinute());
    // 格式化字符串
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
    mDateTime = sdf.format(calendar.getTime());
    mDialog.setTitle(mDateTime);
}

/**
 * 截取字符串
 * 
 * @param src
 *            數(shù)據(jù)源
 * @param pattern
 *            匹配模式
 * @param indexOrLast
 *            最后一個(gè)下標(biāo)
 * @param frontOrBack
 *            取前面的值還是后面的值
 * @return
 */
public static String spliteString(String src, String pattern,
        String indexOrLast, String frontOrBack) {
    // 結(jié)果
    String result = "";
    int location = -1;
    // 不分大小寫相等比較,如果是當(dāng)前下標(biāo)
    if (indexOrLast.equalsIgnoreCase("index")) {
        // 取得字符串第一次出現(xiàn)的地方
        location = src.indexOf(pattern);
    } else {
        // 字符串最后一個(gè)匹配的位置
        location = src.lastIndexOf(pattern);
    }
    // 不分大小寫相等比較辣吃,如果實(shí)在前面
    if (frontOrBack.equalsIgnoreCase("front")) {
        if (location != -1) {
            // 截取字符串
            result = src.substring(0, location);
        } else {
            if (location != -1) {
                // 截取字符串
                result = src.substring(location + 1, src.length());
            }
        }
    }

    return result;
}

/**
 * 實(shí)現(xiàn)將初始日期時(shí)間2016年01月10日 16:45 拆分成年 月 日 時(shí) 分 秒,并賦值給calendar
 * 
 * @param initDateTime
 *            初始日期時(shí)間值 字符串型
 * @return Calendar
 */
private Calendar getCalendarByInitDate(String initDateTime) {
    // 獲取日歷實(shí)例
    Calendar calendar = Calendar.getInstance();
    /*
     * 將初始日期時(shí)間2016年01月10日 16:45 拆分成年 月 日 時(shí) 分 秒
     */
    // 日期
    String date = spliteString(mInitDateTime, "日", "index", "front");
    // 時(shí)間
    String time = spliteString(mInitDateTime, "日", "index", "back");
    // 年份
    String year = spliteString(date, "年", "index", "front");
    // 月分和日期
    String monthAndDay = spliteString(date, "年", "index", "back");
    // 月
    String month = spliteString(monthAndDay, "月", "index", "front");
    // 日
    String dayOfMonth = spliteString(monthAndDay, "月", "index", "back");
    // 時(shí)
    String hour = spliteString(time, ":", "index", "front");
    // 分
    String minute = spliteString(time, ":", "index", "back");
    // 獲取當(dāng)前年份
    int currentYear = Integer.valueOf(year.trim()).intValue();
    // 獲取當(dāng)前月份
    int currentMonth = Integer.valueOf(month.trim()).intValue();
    // 獲取當(dāng)前日
    int currentDay = Integer.valueOf(dayOfMonth.trim()).intValue();
    // 獲取當(dāng)前時(shí)
    int currentHour = Integer.valueOf(hour.trim()).intValue();
    // 獲取當(dāng)前分
    int currentMinute = Integer.valueOf(minute.trim()).intValue();
    // 設(shè)置當(dāng)前年动遭、月、日神得、時(shí)厘惦、分
    calendar.set(currentYear, currentMonth, currentDay, currentHour,
            currentMinute);
    return calendar;
}
}

2、布局文件

布局里面就一個(gè)日期和時(shí)間選擇控件哩簿,這里無(wú)需多言宵蕉,相信各位看官都能看懂

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
  <DatePicker
    android:id="@+id/date_choose"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:calendarViewShown="false"
    android:layout_weight="1" />

<TimePicker
    android:id="@+id/time_choose"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />
</LinearLayout>

3、如何調(diào)用

請(qǐng)看如下使用方法

  public class MainActivity extends Activity implements OnClickListener {
/** 開(kāi)始時(shí)間 */
private Button mBtnStart;
/** 結(jié)束時(shí)間 */
private Button mBtnEnd;
/** 設(shè)置文本按鈕 */
private Button mBtnSetting;
/** 設(shè)置字體樣式按鈕 */
private Button mBtnSetShaow;
private final SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy年MM月dd日 HH:mm:ss");
/** 初始化開(kāi)始時(shí)間 */
protected String mInitDateTimeStart;
/** 初始化結(jié)束時(shí)間 */
protected String mInitDateTimeEnd;
/** DatePickerDialogUtil類 */
private DatePickerDialogUtil mDatePickerDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    initView();
}

private void initView() {

    mInitDateTimeStart = sdf.format(System.currentTimeMillis());
    mInitDateTimeEnd = sdf.format(System.currentTimeMillis());

    mBtnStart = (Button) findViewById(R.id.btn_start);
    mBtnStart.setText(mInitDateTimeStart);
    mBtnStart.setOnClickListener(this);

    mBtnEnd = (Button) findViewById(R.id.btn_end);
    mBtnEnd.setText(mInitDateTimeEnd);
    mBtnEnd.setOnClickListener(this);

    mBtnSetting = (Button) findViewById(R.id.btn_textSet);
    mBtnSetting.setOnClickListener(this);

    mBtnSetShaow = (Button) findViewById(R.id.btn_setShaow);
    mBtnSetShaow.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
    case R.id.btn_start: {// 開(kāi)始時(shí)間按鈕

        mDatePickerDialog = new DatePickerDialogUtil(this,
                mInitDateTimeStart);
        mDatePickerDialog.datePickerDialog(mBtnStart);
        break;
    }

    case R.id.btn_end: {// 結(jié)束時(shí)間按鈕
        mDatePickerDialog = new DatePickerDialogUtil(this, mInitDateTimeEnd);
        mDatePickerDialog.datePickerDialog(mBtnEnd);
        break;
    }
    case R.id.btn_textSet: {// 設(shè)置文本按鈕
        Intent intent = new Intent(this, TextSetActivity.class);
        startActivity(intent);
        break;
    }
    case R.id.btn_setShaow: {// 設(shè)置字體樣式按鈕
        Intent intent = new Intent(this, SetTextViewActivity.class);
        startActivity(intent);
        break;
    }
    }
}
}

結(jié)語(yǔ)

圖比較丑节榜,還請(qǐng)各位見(jiàn)諒羡玛,打臉輕點(diǎn)。代碼很簡(jiǎn)單宗苍,相信各位都可以看懂,知識(shí)不僅僅是要多寫稼稿,還要多總結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浓若,一起剝皮案震驚了整個(gè)濱河市渺杉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挪钓,老刑警劉巖是越,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碌上,居然都是意外死亡倚评,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門馏予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)天梧,“玉大人,你說(shuō)我怎么就攤上這事霞丧∧馗冢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵蛹尝,是天一觀的道長(zhǎng)后豫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)突那,這世上最難降的妖魔是什么挫酿? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮愕难,結(jié)果婚禮上早龟,老公的妹妹穿的比我還像新娘惫霸。我一直安慰自己,他們只是感情好葱弟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布壹店。 她就那樣靜靜地躺著,像睡著了一般芝加。 火紅的嫁衣襯著肌膚如雪茫打。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天妖混,我揣著相機(jī)與錄音,去河邊找鬼轮洋。 笑死制市,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弊予。 我是一名探鬼主播祥楣,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汉柒!你這毒婦竟也來(lái)了误褪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碾褂,失蹤者是張志新(化名)和其女友劉穎兽间,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體正塌,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘀略,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乓诽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜羊。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠天,靈堂內(nèi)的尸體忽然破棺而出讼育,到底是詐尸還是另有隱情,我是刑警寧澤稠集,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布奶段,位于F島的核電站,受9級(jí)特大地震影響巍杈,放射性物質(zhì)發(fā)生泄漏忧饭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一筷畦、第九天 我趴在偏房一處隱蔽的房頂上張望词裤。 院中可真熱鬧刺洒,春花似錦、人聲如沸吼砂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渔肩。三九已至因俐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間周偎,已是汗流浹背抹剩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工困檩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掖看,地道東北人畅哑。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓链患,卻偏偏與公主長(zhǎng)得像蝶柿,于是被迫代替她去往敵國(guó)和親捉超。 傳聞我的和親對(duì)象是個(gè)殘疾皇子资溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 第一次使用日期選擇器<?xml version="1.0" encoding="utf-8"?> <TextVie...
    厚土火焱閱讀 7,896評(píng)論 2 2
  • 最近因?yàn)樾枨笞隽艘粋€(gè)簡(jiǎn)單的選擇日期的demo大莫,我們可以同android自帶的DatePicker控件達(dá)到選擇日期簡(jiǎn)...
    荒誕的墨墨閱讀 3,776評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • android5.0及以上的版本中勿侯,DatePicker 在 calendar 模式下拓瞪,自帶了一個(gè)快速切換年份和日...
    sunrain_閱讀 3,649評(píng)論 0 5
  • (我的雞澤鄉(xiāng)鄰,文友李文英讀《小屋籠盡濟(jì)世心》有感: “筆底吞吐天下事助琐,小屋籠盡濟(jì)世心”精準(zhǔn)詮釋了記者職業(yè)的真諦祭埂。...
    邯鄲趙金海閱讀 989評(píng)論 0 1