天天看點

Android DatePicker前言

前言

話說日期時間選擇控件許多項目都會用到,今天小可不才,也發一個自己寫的日期選擇控件

先上圖

Android DatePicker前言

CC8V2$(JPZ`{WT42ICK7F}K.png

Android DatePicker前言

demo.gif

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

裡面注釋比較詳細,我就不在這裡一一贅述了。

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

/**
 * 日期時間彈出選擇框函數
 * 
 * @param activity
 *            調用父Activity
 * @param dateTime
 *            初始日期時間值,作為彈出視窗的标題和日期時間初始值
 */

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

/**
 * 初始化時間日期
 * 
 * @param datePicker
 *            日期
 * @param timePicker
 *            時間
 */
public void init(DatePicker datePicker, TimePicker timePicker) {
    // 初始化Calendar
    Calendar calendar = Calendar.getInstance();
    // datePicker不等于空,并且初始化時間不為空
    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);
    }
    // 初始化時間
    mDateChoose.init(calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH), this);
    // 設定目前時間
    mTimeChoose.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
    // 設定目前分鐘
    mTimeChoose.setCurrentMinute(calendar.get(Calendar.MINUTE));
}

/**
 * 彈出日期時間選擇框方法
 * 
 * @param dateText
 *            需要設定的日期時間選擇框
 * @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);
    // 初始化日期時間
    init(mDateChoose, mTimeChoose);
    // 設定日期為24小時制
    mTimeChoose.setIs24HourView(true);
    // 時間改變事件監聽器
    mTimeChoose.setOnTimeChangedListener(this);
    showDate = sdf.format(System.currentTimeMillis());
    // 建立對話框
    mDialog = new AlertDialog.Builder(mActivity).setTitle(mInitDateTime)
            .setView(mInflater)
            .setPositiveButton("設定", 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();
    // 設定日期改變
    onDateChanged(null, 0, 0, 0);
    return mDialog;
}

/**
 * 時間監聽器
 */
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    // 設定日期改變
    onDateChanged(null, 0, 0, 0);
}

/**
 * 日期監聽器
 */
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
        int dayOfMonth) {
    // 擷取月曆執行個體
    Calendar calendar = Calendar.getInstance();
    // 設定目前日期和時間
    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
 *            資料源
 * @param pattern
 *            比對模式
 * @param indexOrLast
 *            最後一個下标
 * @param frontOrBack
 *            取前面的值還是後面的值
 * @return
 */
public static String spliteString(String src, String pattern,
        String indexOrLast, String frontOrBack) {
    // 結果
    String result = "";
    int location = -1;
    // 不分大小寫相等比較,如果是目前下标
    if (indexOrLast.equalsIgnoreCase("index")) {
        // 取得字元串第一次出現的地方
        location = src.indexOf(pattern);
    } else {
        // 字元串最後一個比對的位置
        location = src.lastIndexOf(pattern);
    }
    // 不分大小寫相等比較,如果實在前面
    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;
}

/**
 * 實作将初始日期時間2016年01月10日 16:45 拆分成年 月 日 時 分 秒,并指派給calendar
 * 
 * @param initDateTime
 *            初始日期時間值 字元串型
 * @return Calendar
 */
private Calendar getCalendarByInitDate(String initDateTime) {
    // 擷取月曆執行個體
    Calendar calendar = Calendar.getInstance();
    /*
     * 将初始日期時間2016年01月10日 16:45 拆分成年 月 日 時 分 秒
     */
    // 日期
    String date = spliteString(mInitDateTime, "日", "index", "front");
    // 時間
    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");
    // 時
    String hour = spliteString(time, ":", "index", "front");
    // 分
    String minute = spliteString(time, ":", "index", "back");
    // 擷取目前年份
    int currentYear = Integer.valueOf(year.trim()).intValue();
    // 擷取目前月份
    int currentMonth = Integer.valueOf(month.trim()).intValue();
    // 擷取目前日
    int currentDay = Integer.valueOf(dayOfMonth.trim()).intValue();
    // 擷取目前時
    int currentHour = Integer.valueOf(hour.trim()).intValue();
    // 擷取目前分
    int currentMinute = Integer.valueOf(minute.trim()).intValue();
    // 設定目前年、月、日、時、分
    calendar.set(currentYear, currentMonth, currentDay, currentHour,
            currentMinute);
    return calendar;
}
}
           

2、布局檔案

布局裡面就一個日期和時間選擇控件,這裡無需多言,相信各位看官都能看懂

<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、如何調用

請看如下使用方法

public class MainActivity extends Activity implements OnClickListener {
/** 開始時間 */
private Button mBtnStart;
/** 結束時間 */
private Button mBtnEnd;
/** 設定文本按鈕 */
private Button mBtnSetting;
/** 設定字型樣式按鈕 */
private Button mBtnSetShaow;
private final SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy年MM月dd日 HH:mm:ss");
/** 初始化開始時間 */
protected String mInitDateTimeStart;
/** 初始化結束時間 */
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: {// 開始時間按鈕

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

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

結語

圖比較醜,還請各位見諒,打臉輕點。代碼很簡單,相信各位都可以看懂,知識不僅僅是要多寫,還要多總結。

繼續閱讀