DatePicker日期滾動選擇使用詳解
本文實例為大家分享了DatePicker日期滾動選擇的使用,供大家參考,具體內(nèi)容如下
效果圖為:

1.dialog_date.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="wrap_content" ? ? android:orientation="vertical"> ? ? <LinearLayout ? ? ? ? android:orientation="horizontal" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:layout_marginTop="10dp" ? ? ? ? android:background="@color/background"> ? ? ? ? <TextView ? ? ? ? ? ? android:id="@+id/tv_cancle" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content" ? ? ? ? ? ? android:layout_centerVertical="true" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:padding="10dp" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:text="@string/cancle" ? ? ? ? ? ? android:textColor="@color/colorBlack" ? ? ? ? ? ? android:textSize="16sp" /> ? ? ? ? <TextView ? ? ? ? ? ? android:layout_weight="3" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content" ? ? ? ? ? ? android:layout_centerInParent="true" /> ? ? ? ? <TextView ? ? ? ? ? ? android:id="@+id/tv_ok" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:padding="10dp" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content" ? ? ? ? ? ? android:layout_centerVertical="true" ? ? ? ? ? ? android:text="@string/commit" ? ? ? ? ? ? android:textColor="@color/colorBlack" ? ? ? ? ? ? android:textSize="16sp" /> ? ? </LinearLayout> ? ? <DatePicker ? ? ? ? android:id="@+id/datepicker" ? ? ? ? android:datePickerMode="spinner" ? ? ? ? android:calendarViewShown="false" ? ? ? ? android:startYear="2017" ? ? ? ? android:endYear="2020" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="wrap_content" /> </LinearLayout>

布局里看起來還不是滾動式的,但所有工作弄完后,就是滾動啦
2.對應(yīng)的MyDatePicker類:
public class MyDatePicker implements DatePicker.OnDateChangedListener,
? ? ? ? TimePicker.OnTimeChangedListener {
? ? /**
? ? ?* 定義結(jié)果回調(diào)接口
? ? ?*/
? ? public interface ResultHandler {
? ? ? ? void handle(String time);
? ? }
? ? private DatePicker datePicker;
? ? private TextView tv_ok;
? ? private TextView tv_cancle;
? ? private ResultHandler handler;
? ? private String dateTime;
? ? private Context context;
? ? private String initDateTime;
? ? private Dialog datePickerDialog;
? ? public MyDatePicker(Context context, ResultHandler resultHandler, String initDateTime) {
? ? ? ? this.context = context;
? ? ? ? this.handler = resultHandler;
? ? ? ? this.initDateTime = initDateTime;
? ? ? ? initDialog();
? ? }
? ? private void initDialog() {
? ? ? ? if (datePickerDialog == null) {
? ? ? ? ? ? datePickerDialog = new Dialog(context, R.style.mytime_dialog);
// ? ? ? ? ? ?datePickerDialog = new Dialog(context);
? ? ? ? ? ? datePickerDialog.setCancelable(false);
? ? ? ? ? ? datePickerDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
? ? ? ? ? ? datePickerDialog.setContentView(R.layout.dialog_date);
? ? ? ? ? ? Window window = datePickerDialog.getWindow();
? ? ? ? ? ? window.setGravity(Gravity.BOTTOM);
? ? ? ? ? ? window.setWindowAnimations(R.style.dialogWindowAnim); //設(shè)置窗口彈出動畫
? ? ? ? ? ? WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
? ? ? ? ? ? DisplayMetrics dm = new DisplayMetrics();
? ? ? ? ? ? manager.getDefaultDisplay().getMetrics(dm);
? ? ? ? ? ? WindowManager.LayoutParams lp = window.getAttributes();
? ? ? ? ? ? lp.width = dm.widthPixels;
? ? ? ? ? ? window.setAttributes(lp);
? ? ? ? }
? ? ? ? initView();
? ? }
? ? private void initView() {
? ? ? ? datePicker = (DatePicker) datePickerDialog.findViewById(R.id.datepicker);
? ? ? ? tv_ok = (TextView) datePickerDialog.findViewById(R.id.tv_ok);
? ? ? ? tv_cancle = (TextView) datePickerDialog.findViewById(R.id.tv_cancle);
? ? ? ? tv_cancle.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? datePickerDialog.dismiss();
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? tv_ok.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? handler.handle( dateTime );
? ? ? ? ? ? ? ? datePickerDialog.dismiss();
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? datePickerDialog.show();
? ? ? ? initDate(datePicker);
? ? }
? ? public void initDate(DatePicker datePicker) {
? ? ? ? Calendar calendar = Calendar.getInstance();
? ? ? ? if (!(null == initDateTime || "".equals(initDateTime))) {
? ? ? ? ? ? calendar = this.getCalendarByInintData(initDateTime);
? ? ? ? } else {
? ? ? ? ? ? initDateTime = calendar.get(Calendar.YEAR) + "年"
? ? ? ? ? ? ? ? ? ? + calendar.get(Calendar.MONTH) + "月"
? ? ? ? ? ? ? ? ? ? + calendar.get(Calendar.DAY_OF_MONTH) + "日 "
? ? ? ? ? ? ? ? ? ? + calendar.get(Calendar.HOUR_OF_DAY) + ":"
? ? ? ? ? ? ? ? ? ? + calendar.get(Calendar.MINUTE);
? ? ? ? }
? ? ? ? datePicker.init(calendar.get(Calendar.YEAR),
? ? ? ? ? ? ? ? calendar.get(Calendar.MONTH),
? ? ? ? ? ? ? ? calendar.get(Calendar.DAY_OF_MONTH), this);
? ? }
? ? /**
? ? ?* 實現(xiàn)將初始日期時間2012年07月02日 16:45 拆分成年 月 日 時 分 秒,并賦值給calendar
? ? ?*
? ? ?* @param initDateTime
? ? ?* ? ? ? ? ? ?初始日期時間值 字符串型
? ? ?* @return Calendar
? ? ?*/
? ? private Calendar getCalendarByInintData(String initDateTime) {
? ? ? ? Calendar calendar = Calendar.getInstance();
? ? ? ? // 將初始日期時間2012年07月02日 16:45 拆分成年 月 日 時 分 秒
? ? ? ? String date = spliteString(initDateTime, "日", "index", "front"); // 日期
? ? ? ? String time = spliteString(initDateTime, "日", "index", "back"); // 時間
? ? ? ? String yearStr = spliteString(date, "年", "index", "front"); // 年份
? ? ? ? String monthAndDay = spliteString(date, "年", "index", "back"); // 月日
? ? ? ? String monthStr = spliteString(monthAndDay, "月", "index", "front"); // 月
? ? ? ? String dayStr = spliteString(monthAndDay, "月", "index", "back"); // 日
? ? ? ? String hourStr = spliteString(time, ":", "index", "front"); // 時
? ? ? ? String minuteStr = spliteString(time, ":", "index", "back"); // 分
? ? ? ? int currentYear = Integer.valueOf(yearStr.trim()).intValue();
? ? ? ? int currentMonth = Integer.valueOf(monthStr.trim()).intValue() - 1;
? ? ? ? int currentDay = Integer.valueOf(dayStr.trim()).intValue();
? ? ? ? int currentHour = Integer.valueOf(hourStr.trim()).intValue();
? ? ? ? int currentMinute = Integer.valueOf(minuteStr.trim()).intValue();
? ? ? ? calendar.set(currentYear, currentMonth, currentDay, currentHour,
? ? ? ? ? ? ? ? currentMinute);
? ? ? ? return calendar;
? ? }
? ? /**
? ? ?* 截取子串
? ? ?*
? ? ?* @param srcStr
? ? ?* ? ? ? ? ? ?源串
? ? ?* @param pattern
? ? ?* ? ? ? ? ? ?匹配模式
? ? ?* @param indexOrLast
? ? ?* @param frontOrBack
? ? ?* @return
? ? ?*/
? ? public static String spliteString(String srcStr, String pattern,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String indexOrLast, String frontOrBack) {
? ? ? ? String result = "";
? ? ? ? int loc = -1;
? ? ? ? if (indexOrLast.equalsIgnoreCase("index")) {
? ? ? ? ? ? loc = srcStr.indexOf(pattern); // 取得字符串第一次出現(xiàn)的位置
? ? ? ? } else {
? ? ? ? ? ? loc = srcStr.lastIndexOf(pattern); // 最后一個匹配串的位置
? ? ? ? }
? ? ? ? if (frontOrBack.equalsIgnoreCase("front")) {
? ? ? ? ? ? if (loc != -1)
? ? ? ? ? ? ? ? result = srcStr.substring(0, loc); // 截取子串
? ? ? ? } else {
? ? ? ? ? ? if (loc != -1)
? ? ? ? ? ? ? ? result = srcStr.substring(loc + 1, srcStr.length()); // 截取子串
? ? ? ? }
? ? ? ? return result;
? ? }
? ? @Override
? ? public void onDateChanged(DatePicker datePicker, int i, int i1, int i2) {
? ? ? ? // 獲得日歷實例
? ? ? ? Calendar calendar = Calendar.getInstance();
? ? ? ? calendar.set(datePicker.getYear(), datePicker.getMonth(),
? ? ? ? ? ? ? ? datePicker.getDayOfMonth());
? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
? ? ? ? dateTime = sdf.format(calendar.getTime());
? ? }
? ? @Override
? ? public void onTimeChanged(TimePicker timePicker, int i, int i1) {
? ? ? ? onDateChanged(null, 0, 0, 0);
? ? }
}設(shè)置對話框樣式,核心代碼:
private void initDialog() {
? ? ? ? if (datePickerDialog == null) {
? ? ? ? ? ? datePickerDialog = new Dialog(context, R.style.mytime_dialog);
// ? ? ? ? ? ?datePickerDialog = new Dialog(context);
? ? ? ? ? ? datePickerDialog.setCancelable(false);
? ? ? ? ? ? datePickerDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
? ? ? ? ? ? datePickerDialog.setContentView(R.layout.dialog_date);
? ? ? ? ? ? Window window = datePickerDialog.getWindow();
? ? ? ? ? ? window.setGravity(Gravity.BOTTOM);//使對話框出現(xiàn)在底部
? ? ? ? ? ? window.setWindowAnimations(R.style.dialogWindowAnim); //設(shè)置窗口彈出動畫
? ? ? ? ? ? WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
? ? ? ? ? ? DisplayMetrics dm = new DisplayMetrics();
? ? ? ? ? ? manager.getDefaultDisplay().getMetrics(dm);
? ? ? ? ? ? WindowManager.LayoutParams lp = window.getAttributes();
? ? ? ? ? ? lp.width = dm.widthPixels;
? ? ? ? ? ? window.setAttributes(lp);
? ? ? ? }
? ? ? ? initView();
? ? }定義對話框style風(fēng)格和添加動畫:
<style name="mytime_dialog" ?parent="Theme.AppCompat.Light.NoActionBar"> ? ? ? ? <item name="android:windowFrame">@null</item> ? ? ? ? <item name="android:windowNoTitle">true</item> ? ? ? ? <item name="android:windowIsFloating">true</item> ? ? ? ? <item name="android:windowContentOverlay">@null</item> ? ? ? ? <item name="android:windowBackground">@color/background</item> ? ? </style> ? ? <style name="dialogWindowAnim" parent="android:Animation" mce_bogus="1"> ? ? ? ? <item name="android:windowEnterAnimation">@anim/dialog_enter_anim</item> ? ? ? ? <item name="android:windowExitAnimation">@anim/dialog_exit_anim</item> </style>
dialog_enter_anim.xml的代碼:
<?xml version="1.0" encoding="utf-8"?> <!-- 彈出時動畫 --> <set xmlns:android="http://schemas.android.com/apk/res/android"> ? ? <scale ? ? ? ? android:interpolator="@android:anim/accelerate_interpolator" ? ? ? ? android:fromXScale="1.0" ? ? ? ? android:toXScale="1.0" ? ? ? ? android:fromYScale="0.0" ? ? ? ? android:toYScale="1.0" ? ? ? ? android:pivotX="0%" ? ? ? ? android:pivotY="100%" ? ? ? ? android:fillAfter="false" ? ? ? ? android:duration="400"/> </set>
dialog_exit_anim.xml的代碼:
<?xml version="1.0" encoding="utf-8"?> <!-- 退出時動畫效果 --> <set xmlns:android="http://schemas.android.com/apk/res/android"> ? ? <scale ? ? ? ? android:interpolator="@android:anim/accelerate_interpolator" ? ? ? ? android:fromXScale="1.0" ? ? ? ? android:toXScale="1.0" ? ? ? ? android:fromYScale="1.0" ? ? ? ? android:toYScale="0.0" ? ? ? ? android:pivotX="0%" ? ? ? ? android:pivotY="100%" ? ? ? ? android:fillAfter="false" ? ? ? ? android:duration="400"/> </set>
3.在主界面activity中需要使用日期對話框的地方,調(diào)用函數(shù)initMyDatePicker()即可:
private void initMyDatePicker() {
? ? ? ? SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 ? ?HH:mm");//格式為 2013年9月3日 14:44
? ? ? ? Date curDate = new Date(System.currentTimeMillis());//獲取當(dāng)前時間
? ? ? ? String currentDate = formatter.format(curDate);
? ? ? ? myDatePicker = new MyDatePicker(this, new MyDatePicker.ResultHandler() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void handle(String time) {
? ? ? ? ? ? ? ? tv_showCurrentDate1.setText(time );
? ? ? ? ? ? }
? ? ? ? },currentDate);
? ? }注:DatePicker的樣式會受主題的樣式影響,寫的時候弄了好久,一定要注意才行
<style name="mytime_dialog" ?parent="Theme.AppCompat.Light.NoActionBar"> ? ? ? ? <item name="android:windowFrame">@null</item> ? ? ? ? <item name="android:windowNoTitle">true</item> ? ? ? ? <item name="android:windowIsFloating">true</item> ? ? ? ? <item name="android:windowContentOverlay">@null</item> ? ? ? ? <item name="android:windowBackground">@color/background</item> </style>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android SDK命令行工具Monkey參數(shù)及使用解析
這篇文章主要介紹了Android SDK命令行工具Monkey參,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值數(shù)及使用解析,需要的朋友可以參考下2020-10-10
Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例
這篇文章主要為大家介紹了Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Android實現(xiàn)圖片壓縮(bitmap的六種壓縮方式)
Android中圖片是以bitmap形式存在的,這篇文章主要介紹了Android實現(xiàn)圖片壓縮(bitmap的六種壓縮方式),有興趣的可以了解一下。2017-02-02
AndroidUI組件SlidingTabLayout實現(xiàn)ViewPager頁滑動效果
這篇文章主要介紹了AndroidUI組件SlidingTabLayout實現(xiàn)ViewPager頁滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Android 開機應(yīng)用掃描相關(guān)總結(jié)
本篇文章只是作為指南引導(dǎo)去看PkMS,不會貼大段代碼進行分析,更多是基于方法分析實現(xiàn)的邏輯,另外就是代碼是基于Android 11,與Android 10之前代碼有比較大的差別。2021-05-05
Android通過反射實現(xiàn)強制停止應(yīng)用程序的方法
這篇文章主要介紹了Android通過反射實現(xiàn)強制停止應(yīng)用程序的方法,涉及Android的反射機制與進程操作的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android編程實現(xiàn)在一個程序中啟動另一個程序的方法
這篇文章主要介紹了Android編程實現(xiàn)在一個程序中啟動另一個程序的方法,結(jié)合實例形式分析了Android通過ResolveInfo類來取得啟動Acitivty類名的方法來啟動另一個程序的方法,需要的朋友可以參考下2017-02-02

