Android使用WheelView自定义时间选择器弹窗
16lz
2021-12-04
上图:
代码:
public class DateDialog extends Dialog { private WheelView wv_year; private WheelView wv_month; private WheelView wv_day; private WheelView wv_hour; private WheelView wv_minute; private TextView tv_dialog_cancel; private TextView tv_dialog_ok; private List listYear = new ArrayList<>(); private List listMonth = new ArrayList<>(); private List listDay = new ArrayList<>(); private List listHour = new ArrayList<>(); private List listMinute = new ArrayList<>(); private Context mContext; private int currentYear; //系统当前时间 private int currentMonth; private int currentDay; private int currentHour; private int currentMinute; private int selectYear = 0; private int selectMonth = 0; public DateDialog(@NonNull Context context) { super(context, R.style.DocOptionDialogStyle); this.mContext = context; View view = LayoutInflater.from(context).inflate(R.layout.dialog_date_layout, null); setContentView(view); initData(); initView(view); } private void initData() { initCurrentDate(); initYear(); initMonth(); initDay(); initHour(); initMinute(); } /** * 初始化系统当前时间 */ private void initCurrentDate() { Calendar calendar = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); currentYear = calendar.get(Calendar.YEAR); currentMonth = calendar.get(Calendar.MONTH); currentDay = calendar.get(Calendar.DAY_OF_MONTH); currentHour = calendar.get(Calendar.HOUR_OF_DAY); currentMinute = calendar.get(Calendar.MINUTE); } /** * 集合添加年 */ private void initYear() { for (int i = currentYear; i <= currentYear + 1; i++) { listYear.add(i + "年"); } } /** * 集合添加月 */ private void initMonth() { for (int i = 1; i <= 12; i++) { listMonth.add(String.format("%02d", i) + "月"); } } /** * 集合添加天数 */ private void initDay() { //判断一个月有多少天 int hasDay = getDay(currentYear, (currentMonth+1)); for (int i = 1; i <= hasDay; i++) { listDay.add(String.format("%02d", i) + "日"); } } /** * 集合添加小时 */ private void initHour() { for (int i = 0; i <= 24; i++) { listHour.add(String.format("%02d", i) + "点"); } } /** * 集合添加分钟 */ private void initMinute() { for (int i = 0; i <= 60; i++) { listMinute.add(String.format("%02d", i) + "分"); } } private void initView(View view) { tv_dialog_cancel = view.findViewById(R.id.tv_dialog_cancel); tv_dialog_ok = view.findViewById(R.id.tv_dialog_ok); wv_year = view.findViewById(R.id.wv_year); wv_month = view.findViewById(R.id.wv_month); wv_day = view.findViewById(R.id.wv_day); wv_hour = view.findViewById(R.id.wv_hour); wv_minute = view.findViewById(R.id.wv_minute); //取消弹窗 tv_dialog_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); //设置在屏幕中的位置 Window window = getWindow(); window.setGravity(Gravity.CENTER); //居中 DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics(); window.setLayout((int) (displayMetrics.widthPixels * 0.9), WindowManager.LayoutParams.WRAP_CONTENT); //设置年数据 wv_year.setWheelAdapter(new ArrayWheelAdapter(mContext)); // 文本数据源 wv_year.setSkin(WheelView.Skin.Holo); // common皮肤 wv_year.setWheelData(listYear); wv_year.setSelection(0); wv_year.setVisibility(View.VISIBLE); //解决数据加载延迟 wv_year.setOnWheelItemSelectedListener(new WheelView.OnWheelItemSelectedListener() { @Override public void onItemSelected(int position, Object o) { updateDay(); } }); //月 wv_month.setWheelAdapter(new ArrayWheelAdapter(mContext)); // 文本数据源 wv_month.setSkin(WheelView.Skin.Holo); // common皮肤 wv_month.setWheelData(listMonth); wv_month.setSelection(currentMonth); wv_month.setVisibility(View.VISIBLE); wv_month.setOnWheelItemSelectedListener(new WheelView.OnWheelItemSelectedListener() { @Override public void onItemSelected(int position, Object o) { updateDay(); } }); //日 wv_day.setWheelAdapter(new ArrayWheelAdapter(mContext)); // 文本数据源 wv_day.setSkin(WheelView.Skin.Holo); // common皮肤 wv_day.setWheelData(listDay); wv_day.setSelection(currentDay - 1); wv_day.setVisibility(View.VISIBLE); //时 wv_hour.setWheelAdapter(new ArrayWheelAdapter(mContext)); // 文本数据源 wv_hour.setSkin(WheelView.Skin.Holo); // common皮肤 wv_hour.setLoop(true); wv_hour.setWheelData(listHour); wv_hour.setSelection(currentHour); wv_hour.setVisibility(View.VISIBLE); //分 wv_minute.setWheelAdapter(new ArrayWheelAdapter(mContext)); // 文本数据源 wv_minute.setSkin(WheelView.Skin.Holo); // common皮肤 wv_minute.setLoop(true); wv_minute.setWheelData(listMinute); wv_minute.setSelection(currentMinute); wv_minute.setVisibility(View.VISIBLE); } /** * 用户滑动时更新每个月的天数 */ private void updateDay() { //获取当前滑动的位置 selectYear = Integer.parseInt(wv_year.getSelectionItem().toString().replace("年", "")); selectMonth = Integer.parseInt(wv_month.getSelectionItem().toString().replace("月", "")); //判断一个月有多少天 int hasDay = getDay(selectYear, selectMonth); listDay.clear(); for (int i = 1; i <= hasDay; i++) { listDay.add(String.format("%02d", i) + "日"); } wv_day.setWheelData(listDay); } /** * 根据是否闰年和月份判断本月的天数 * * @param year * @param month * @return */ private int getDay(int year, int month) { int day = 30; boolean flag = false; switch (year % 4) { case 0: flag = true; break; default: flag = false; break; } switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 2: day = flag ? 29 : 28; break; default: day = 30; break; } return day; } /** * 确定按钮监听 * * @param listener */ public void onClickOkBtnLisitener(View.OnClickListener listener) { tv_dialog_ok.setOnClickListener(listener); } /** * 获取时间 * @return */ public String getDate(){ String year = wv_year.getSelectionItem().toString().replace("年",""); String month = wv_month.getSelectionItem().toString().replace("月",""); String day = wv_day.getSelectionItem().toString().replace("日",""); String hour = wv_hour.getSelectionItem().toString().replace("点",""); String minute = wv_minute.getSelectionItem().toString().replace("分",""); return year+"-"+month+"-"+day+" "+hour+":"+minute; } /** * 根据时间戳验证用户选择时间是否合理 * @return */ public boolean isValid(){ long time = Long.parseLong(TimeUtil.createTimestamp(getDate())); if (TimeUtil.getUnixStamp()>time){ return false; } return true; }}
xml布局:
<?xml version="1.0" encoding="utf-8"?>
结合开源库使用:https://github.com/venshine/WheelView
更多相关文章
- Android(安卓)Spinner控件详解
- Android(安卓)studio 57 MP3 音乐播放器 代码上一曲下一曲
- [转] android 日期时间格式转换
- Android—常用控件(四)日期/时间控件
- Android系统时间
- Android(安卓)动态显示时间
- Android常用控件之ListView(一)
- Android中的网络时间同步
- Android中的网络时间同步
随机推荐
- Android中集成第三方软件包(.jar, .so)
- andriod给ListView中的TextView增加跑马
- Android_Android中屏幕相关的操作
- Google SwipeRefreshLayout(Goolge官方下
- curl: (22) The requested URL returned
- Android中最重要的采用pull解析xml文件
- Android之如何使用快速联系徽章
- Android(安卓)Activity间切换动画效果
- Android(安卓)TabLayout+ViewPager+Fragm
- Android Media (Audio) Framework 多媒体