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

2020-10-30 01:13:48 浏览数 (1)

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

主布局:activity_main.xml

代码语言:javascript复制
<?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:

代码语言:javascript复制
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; 
 } 
 
} 

主要的类:

代码语言:javascript复制
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(); 
} 
} 
}

底部弹出框布局:

代码语言:javascript复制
<?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  

运行效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助。

0 人点赞