DatePicker日期滚动选择使用详解
作者:芒果蜜桃π 时间:2022-12-09 04:13:50
本文实例为大家分享了DatePicker日期滚动选择的使用,供大家参考,具体内容如下
效果图为:
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.对应的MyDatePicker类:
public class MyDatePicker implements DatePicker.OnDateChangedListener,
TimePicker.OnTimeChangedListener {
/**
* 定义结果回调接口
*/
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); //设置窗口弹出动画
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);
}
/**
* 实现将初始日期时间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); // 取得字符串第一次出现的位置
} 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);
}
}
设置对话框样式,核心代码:
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); //设置窗口弹出动画
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风格和添加动画:
<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中需要使用日期对话框的地方,调用函数initMyDatePicker()即可:
private void initMyDatePicker() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");//格式为 2013年9月3日 14:44
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
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>
来源:https://blog.csdn.net/An_nAl/article/details/77069472
标签:DatePicker,日期,选择
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C# Linq延迟查询的执行实例代码
2023-04-24 05:34:59
详解java调用python的几种用法(看这篇就够了)
2023-04-10 22:15:57
![](https://img.aspxhome.com/file/2023/2/104972_0s.png)
Unity UI实现循环播放序列图
2023-03-14 15:51:10
![](https://img.aspxhome.com/file/2023/6/111196_0s.png)
spring boot ${}占位符不起作用的解决方案
2022-06-28 20:49:29
![](https://img.aspxhome.com/file/2023/0/70580_0s.png)
@Autowired注解注入的xxxMapper报错问题及解决
2022-10-01 10:31:02
![](https://img.aspxhome.com/file/2023/5/63635_0s.jpg)
C++ 中String 替换指定字符串的实例详解
2021-06-05 19:08:23
android电源信息查看(电量、温度、电压)实例代码
2022-04-30 15:41:04
Java中的线程同步与ThreadLocal无锁化线程封闭实现
2023-09-17 04:48:06
listView的item中有checkbox,导致setOnItemClick失效的原因及解决办法
2022-09-04 10:57:12
解析C#设计模式编程中外观模式Facade Pattern的应用
2021-08-08 05:10:37
![](https://img.aspxhome.com/file/2023/9/67549_0s.jpg)
Android Drawable代码编写的新姿势分享
2021-11-21 04:11:12
![](https://img.aspxhome.com/file/2023/8/122208_0s.png)
Android入门之onTouchEvent触碰事件的示例详解
2021-08-31 14:27:58
![](https://img.aspxhome.com/file/2023/3/130463_0s.png)
Android studio报: java.lang.ExceptionInInitializerError 错误
2022-08-14 14:21:30
![](https://img.aspxhome.com/file/2023/7/88687_0s.png)
MyBatis JdbcType 与Oracle、MySql数据类型对应关系说明
2023-08-23 02:23:06
![](https://img.aspxhome.com/file/2023/6/58276_0s.jpg)
Java字符流与字节流区别与用法分析
2023-09-08 07:48:54
C#实现类似新浪微博长URL转短地址的方法
2023-06-02 12:59:28
java实现新浪微博Oauth接口发送图片和文字的方法
2023-11-29 01:43:04
java中用String.Join美化代码的实例讲解
2022-03-04 08:17:04
![](https://img.aspxhome.com/file/2023/7/64947_0s.jpg)
mybatis如何使用Criteria的and和or进行联合查询
2023-02-23 00:44:13
Android Zipalign工具优化Android APK应用
2021-09-15 13:16:27
![](https://img.aspxhome.com/file/2023/3/138063_0s.gif)