Android日期选择器实现年月日 * 联动

作者:lijiao 时间:2022-12-13 03:35:59 

最近项目里面用到了一个日期选择器,实现现在主流的WheelView滑动选择,整理了下,做了个Demo.废话不多说,直接上代码.

主布局:activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.user.mydate.MainActivity">

<TextView
 android:id="@+id/selectDate"
 android:layout_width="match_parent"
 android:layout_height="30dp"
 android:gravity="center"
 android:onClick="selectDate"
 android:clickable="true"
 android:text="日期选择" />
</RelativeLayout>

MainActivity:


package com.example.user.mydate;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;

import com.example.user.mydate.view.ChangeDatePopwindow;

public class MainActivity extends Activity {

private TextView selectDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 setContentView(R.layout.activity_main);
 selectDate= (TextView) findViewById(R.id.selectDate);
}

public void selectDate(View v){
 if (v.getId()==R.id.selectDate){
  selectDate();
 }

}

private String[] selectDate() {
 final String[] str = new String[10];
 ChangeDatePopwindow mChangeBirthDialog = new ChangeDatePopwindow(
   this);
 mChangeBirthDialog.setDate("2016", "1", "1");
 mChangeBirthDialog.showAtLocation(selectDate, Gravity.BOTTOM, 0, 0);
 mChangeBirthDialog.setBirthdayListener(new ChangeDatePopwindow.OnBirthListener() {

@Override
  public void onClick(String year, String month, String day) {
   // TODO Auto-generated method stub
   Toast.makeText(MainActivity.this,year + "-" + month + "-" + day,Toast.LENGTH_LONG).show();
   StringBuilder sb = new StringBuilder();
   sb.append(year.substring(0, year.length() - 1)).append("-").append(month.substring(0, day.length() - 1)).append("-").append(day);
   str[0] = year + "-" + month + "-" + day;
   str[1] = sb.toString();
   selectDate.setText(year + "-" + month + "-" + day);

}
 });
 return str;
}

}

主要的类:


package com.example.user.mydate.view;

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.example.user.mydate.R;
import com.example.user.mydate.view.wheelview.OnWheelChangedListener;
import com.example.user.mydate.view.wheelview.OnWheelScrollListener;
import com.example.user.mydate.view.wheelview.WheelView;
import com.example.user.mydate.view.wheelview.adapter.AbstractWheelTextAdapter1;

import java.util.ArrayList;
import java.util.Calendar;

/**
* Author: Chen.yuan
* Email: hubeiqiyuan2010@163.com
* Date: 2016/7/28 17:37
* Description:日期选择window
*/
public class ChangeDatePopwindow extends PopupWindow implements View.OnClickListener {

private Context context;
private WheelView wvYear;
private WheelView wvMonth;
private WheelView wvDay;

private TextView btnSure;
private TextView btnCancel;

private ArrayList<String> arry_years = new ArrayList<String>();
private ArrayList<String> arry_months = new ArrayList<String>();
private ArrayList<String> arry_days = new ArrayList<String>();
private CalendarTextAdapter mYearAdapter;
private CalendarTextAdapter mMonthAdapter;
private CalendarTextAdapter mDaydapter;

private String month;
private String day;

private String currentYear = getYear();
private String currentMonth = getMonth();
private String currentDay = getDay();

private int maxTextSize = 24;
private int minTextSize = 14;

private boolean issetdata = false;

private String selectYear;
private String selectMonth;
private String selectDay;

private OnBirthListener onBirthListener;

public ChangeDatePopwindow(final Context context) {
 super(context);
 this.context = context;
 View view=View.inflate(context, R.layout.dialog_myinfo_changebirth,null);
 wvYear = (WheelView) view.findViewById(R.id.wv_birth_year);
 wvMonth = (WheelView) view.findViewById(R.id.wv_birth_month);
 wvDay = (WheelView) view.findViewById(R.id.wv_birth_day);
 btnSure = (TextView) view.findViewById(R.id.btn_myinfo_sure);
 btnCancel = (TextView) view.findViewById(R.id.btn_myinfo_cancel);

//设置SelectPicPopupWindow的View
 this.setContentView(view);
 //设置SelectPicPopupWindow弹出窗体的宽
 this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
 //设置SelectPicPopupWindow弹出窗体的高
 this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
 //设置SelectPicPopupWindow弹出窗体可点击
 this.setFocusable(true);
 //设置SelectPicPopupWindow弹出窗体动画效果
//  this.setAnimationStyle(R.style.AnimBottom);
 //实例化一个ColorDrawable颜色为半透明
 ColorDrawable dw = new ColorDrawable(0xb0000000);
 //设置SelectPicPopupWindow弹出窗体的背景
 this.setBackgroundDrawable(dw);

btnSure.setOnClickListener(this);
 btnCancel.setOnClickListener(this);

if (!issetdata) {
  initData();
 }
 initYears();
 mYearAdapter = new CalendarTextAdapter(context, arry_years, setYear(currentYear), maxTextSize, minTextSize);
 wvYear.setVisibleItems(5);
 wvYear.setViewAdapter(mYearAdapter);
 wvYear.setCurrentItem(setYear(currentYear));

initMonths(Integer.parseInt(month));
 mMonthAdapter = new CalendarTextAdapter(context, arry_months, setMonth(currentMonth), maxTextSize, minTextSize);
 wvMonth.setVisibleItems(5);
 wvMonth.setViewAdapter(mMonthAdapter);
 wvMonth.setCurrentItem(setMonth(currentMonth));

initDays(Integer.parseInt(day));
 mDaydapter = new CalendarTextAdapter(context, arry_days, Integer.parseInt(currentDay) - 1, maxTextSize, minTextSize);
 wvDay.setVisibleItems(5);
 wvDay.setViewAdapter(mDaydapter);
 wvDay.setCurrentItem(Integer.parseInt(currentDay) - 1);

wvYear.addChangingListener(new OnWheelChangedListener() {

@Override
  public void onChanged(WheelView wheel, int oldValue, int newValue) {
   // TODO Auto-generated method stub
   String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
   selectYear = currentText;
   setTextviewSize(currentText, mYearAdapter);
   currentYear = currentText.substring(0, currentText.length()-1).toString();
   Log.d("currentYear==",currentYear);
   setYear(currentYear);
   initMonths(Integer.parseInt(month));
   mMonthAdapter = new CalendarTextAdapter(context, arry_months, 0, maxTextSize, minTextSize);
   wvMonth.setVisibleItems(5);
   wvMonth.setViewAdapter(mMonthAdapter);
   wvMonth.setCurrentItem(0);

calDays(currentYear, month);
  }
 });

wvYear.addScrollingListener(new OnWheelScrollListener() {

@Override
  public void onScrollingStarted(WheelView wheel) {
   // TODO Auto-generated method stub

}

@Override
  public void onScrollingFinished(WheelView wheel) {
   // TODO Auto-generated method stub
   String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
   setTextviewSize(currentText, mYearAdapter);
  }
 });

wvMonth.addChangingListener(new OnWheelChangedListener() {

@Override
  public void onChanged(WheelView wheel, int oldValue, int newValue) {
   // TODO Auto-generated method stub
   String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
   selectMonth = currentText;
   setTextviewSize(currentText, mMonthAdapter);
   setMonth(currentText.substring(0, 1));
   initDays(Integer.parseInt(day));
   mDaydapter = new CalendarTextAdapter(context, arry_days, 0, maxTextSize, minTextSize);
   wvDay.setVisibleItems(5);
   wvDay.setViewAdapter(mDaydapter);
   wvDay.setCurrentItem(0);

calDays(currentYear, month);
  }
 });

wvMonth.addScrollingListener(new OnWheelScrollListener() {

@Override
  public void onScrollingStarted(WheelView wheel) {
   // TODO Auto-generated method stub

}

@Override
  public void onScrollingFinished(WheelView wheel) {
   // TODO Auto-generated method stub
   String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
   setTextviewSize(currentText, mMonthAdapter);
  }
 });

wvDay.addChangingListener(new OnWheelChangedListener() {

@Override
  public void onChanged(WheelView wheel, int oldValue, int newValue) {
   // TODO Auto-generated method stub
   String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());
   setTextviewSize(currentText, mDaydapter);
   selectDay = currentText;
  }
 });

wvDay.addScrollingListener(new OnWheelScrollListener() {

@Override
  public void onScrollingStarted(WheelView wheel) {
   // TODO Auto-generated method stub

}

@Override
  public void onScrollingFinished(WheelView wheel) {
   // TODO Auto-generated method stub
   String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());
   setTextviewSize(currentText, mDaydapter);
  }
 });
}

public void initYears() {
 for (int i = Integer.parseInt(getYear()); i > 1950; i--) {
  arry_years.add(i + "年");
 }
}

public void initMonths(int months) {
 arry_months.clear();
 for (int i = 1; i <= months; i++) {
  arry_months.add(i + "月");
 }
}

public void initDays(int days) {
 arry_days.clear();
 for (int i = 1; i <= days; i++) {
  arry_days.add(i + "日");
 }
}

private class CalendarTextAdapter extends AbstractWheelTextAdapter1 {
 ArrayList<String> list;

protected CalendarTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) {
  super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem, maxsize, minsize);
  this.list = list;
  setItemTextResource(R.id.tempValue);
 }

@Override
 public View getItem(int index, View cachedView, ViewGroup parent) {
  View view = super.getItem(index, cachedView, parent);
  return view;
 }

@Override
 public int getItemsCount() {
  return list.size();
 }

@Override
 protected CharSequence getItemText(int index) {
  return list.get(index) + "";
 }
}

public void setBirthdayListener(OnBirthListener onBirthListener) {
 this.onBirthListener = onBirthListener;
}

@Override
public void onClick(View v) {

if (v == btnSure) {
  if (onBirthListener != null) {
   onBirthListener.onClick(selectYear, selectMonth, selectDay);
   Log.d("cy",""+selectYear+""+selectMonth+""+selectDay);
  }
 } else if (v == btnSure) {

} else {
  dismiss();
 }
 dismiss();

}

public interface OnBirthListener {
 public void onClick(String year, String month, String day);
}

/**
 * 设置字体大小
 *
 * @param curriteItemText
 * @param adapter
 */
public void setTextviewSize(String curriteItemText, CalendarTextAdapter adapter) {
 ArrayList<View> arrayList = adapter.getTestViews();
 int size = arrayList.size();
 String currentText;
 for (int i = 0; i < size; i++) {
  TextView textvew = (TextView) arrayList.get(i);
  currentText = textvew.getText().toString();
  if (curriteItemText.equals(currentText)) {
   textvew.setTextSize(maxTextSize);
  } else {
   textvew.setTextSize(minTextSize);
  }
 }
}

public String getYear() {
 Calendar c = Calendar.getInstance();
 return c.get(Calendar.YEAR)+"";
}

public String getMonth() {
 Calendar c = Calendar.getInstance();
 return c.get(Calendar.MONTH) + 1+"";
}

public String getDay() {
 Calendar c = Calendar.getInstance();
 return c.get(Calendar.DATE)+"";
}

public void initData() {
 setDate(getYear(), getMonth(), getDay());
 this.currentDay = 1+"";
 this.currentMonth = 1+"";
}

/**
 * 设置年月日
 *
 * @param year
 * @param month
 * @param day
 */
public void setDate(String year, String month, String day) {
 selectYear = year + "年";
 selectMonth = month + "月";
 selectDay = day + "日";
 issetdata = true;
 this.currentYear = year;
 this.currentMonth = month;
 this.currentDay = day;
 if (year == getYear()) {
  this.month = getMonth();
 } else {
  this.month = 12+"";
 }
 calDays(year, month);
}

/**
 * 设置年份
 *
 * @param year
 */
public int setYear(String year) {
 int yearIndex = 0;
 if (!year.equals(getYear())) {
  this.month = 12+"";
 } else {
  this.month = getMonth();
 }
 for (int i = Integer.parseInt(getYear()); i > 1950; i--) {
  if (i == Integer.parseInt(year)) {
   return yearIndex;
  }
  yearIndex++;
 }
 return yearIndex;
}

/**
 * 设置月份
 *
 * @param month
 * @param month
 * @return
 */
public int setMonth(String month) {
 int monthIndex = 0;
 calDays(currentYear, month);
 for (int i = 1; i < Integer.parseInt(this.month); i++) {
  if (Integer.parseInt(month) == i) {
   return monthIndex;
  } else {
   monthIndex++;
  }
 }
 return monthIndex;
}

/**
 * 计算每月多少天
 *
 * @param month
 * @param year
 */
public void calDays(String year, String month) {
 boolean leayyear = false;
 if (Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0) {
  leayyear = true;
 } else {
  leayyear = false;
 }
 for (int i = 1; i <= 12; i++) {
  switch (Integer.parseInt(month)) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
   this.day = 31+"";
   break;
  case 2:
   if (leayyear) {
    this.day = 29+"";
   } else {
    this.day = 28+"";
   }
   break;
  case 4:
  case 6:
  case 9:
  case 11:
   this.day = 30+"";
   break;
  }
 }
 if (year.equals( getYear()) && month .equals( getMonth())) {
  this.day = getDay();
 }
}
}

底部弹出框布局:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ly_myinfo_changeaddress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_transparent"
android:gravity="bottom"
android:orientation="vertical" >

<LinearLayout
android:id="@+id/ly_myinfo_changeaddress_child"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/white"
android:orientation="vertical" >

<RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="44dp"
 >

<TextView
  android:id="@+id/btn_myinfo_cancel"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:paddingLeft="12dp"
  android:text="取消"
  android:gravity="center"
  android:layout_alignParentLeft="true"
  android:layout_marginRight="15dip"
  android:textColor="@color/color_e84515"
  android:textSize="13sp" />

<TextView
  android:id="@+id/btn_myinfo_sure"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:layout_alignParentRight="true"
  android:gravity="center"
  android:text="完成"
  android:textColor="@color/color_e84515"
  android:paddingRight="12dp"
  android:textSize="12sp" />

</RelativeLayout>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="0.5dp"
 android:background="@color/color_d8d8d8"
 />
<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="160dip"
 android:orientation="horizontal"
 android:gravity="center_vertical">
 <com.example.user.mydate.view.wheelview.WheelView
  android:id="@+id/wv_birth_year"
  android:layout_width="0dip"
  android:layout_weight="1"
  android:layout_height="match_parent"
  android:layout_gravity="center_vertical"
  />
 <com.example.user.mydate.view.wheelview.WheelView
  android:id="@+id/wv_birth_month"
  android:layout_width="0dip"
  android:layout_weight="1"
  android:layout_height="match_parent"
  android:layout_gravity="center_vertical"
  />

<com.example.user.mydate.view.wheelview.WheelView
  android:id="@+id/wv_birth_day"
  android:layout_width="0dip"
  android:layout_weight="1"
  android:layout_height="match_parent"
  android:layout_gravity="center_vertical"
  />
</LinearLayout>

</LinearLayout>

</LinearLayout>

运行效果图:

Android日期选择器实现年月日 * 联动

标签:Android,日期选择器, , 联动
0
投稿

猜你喜欢

  • java使用正则抓取网页邮箱

    2022-12-02 10:30:30
  • Matlab实现贪吃蛇小游戏的示例代码

    2023-07-14 14:13:00
  • 新手必看Unity2019 2020保姆级安装教程

    2023-08-23 07:13:37
  • Unity实现仿3D轮转图效果

    2023-11-24 12:26:56
  • Android实现3D云标签效果

    2022-06-05 10:33:50
  • SpringMVC使用hibernate-validator进行参数校验最佳实践记录

    2022-11-12 23:44:04
  • 详解Java中用于查找对象哈希码值的hashCode()函数

    2023-09-17 02:52:19
  • C#实现读取txt文件生成Word文档

    2022-08-06 19:03:22
  • Android 通过onDraw实现在View中绘图操作的示例

    2023-07-14 02:15:38
  • 解决Swagger2返回map复杂结构不能解析的问题

    2022-07-15 09:17:04
  • Android播放assets文件里视频文件相关问题分析

    2021-08-10 20:04:41
  • 深入学习C#网络编程之HTTP应用编程(下)

    2023-03-16 12:06:37
  • Android下使用TCPDUMP实现数据抓包教程

    2021-12-08 07:58:42
  • java:程序包org.springframework.boot不存在的完美解决方法

    2023-09-03 20:37:32
  • java日期工具类实例分享

    2023-05-17 17:50:40
  • Android账号注册实现点击获取验证码倒计时效果

    2023-05-18 05:46:33
  • Java 多线程并发LockSupport

    2022-04-07 23:59:57
  • 基于WPF实现步骤控件的示例代码

    2021-09-12 15:16:16
  • Swagger2配置方式(解决404报错)

    2022-08-30 17:21:13
  • C#中File类的文件操作方法详解

    2022-10-04 01:25:28
  • asp之家 软件编程 m.aspxhome.com