日期选择器

来源:互联网 发布:国网电子商务公司知乎 编辑:程序博客网 时间:2024/06/05 03:59




先上最后效果图:


WheelView开源地址:https://github.com/chemalarrea/Android-wheel

部分代码如下(DatePickerDialog.Java):

[java] view plain copy
  1. package com.ywl5320.pickaddress;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Calendar;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.util.DisplayMetrics;  
  10. import android.view.Gravity;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.view.ViewGroup.LayoutParams;  
  14. import android.widget.LinearLayout;  
  15. import android.widget.TextView;  
  16.   
  17. import com.ywl5320.pickaddress.wheel.widget.adapters.AbstractWheelTextAdapter;  
  18. import com.ywl5320.pickaddress.wheel.widget.views.OnWheelChangedListener;  
  19. import com.ywl5320.pickaddress.wheel.widget.views.OnWheelScrollListener;  
  20. import com.ywl5320.pickaddress.wheel.widget.views.WheelView;  
  21.   
  22. /** 
  23.  * 日期选择对话框 
  24.  *  
  25.  * @author pengjian 
  26.  * 
  27.  */  
  28. public class DatePickerDialog extends BaseDialog implements  
  29.         android.view.View.OnClickListener {  
  30.   
  31.     private static final int MIN_YEAR = 1970;  
  32.     private static final int MAX_YEAR = 2100;  
  33.   
  34.     public static final int DIALOG_MODE_CENTER = 0;  
  35.     public static final int DIALOG_MODE_BOTTOM = 1;  
  36.   
  37.     private Context context;  
  38.     private WheelView wvYear;  
  39.     private WheelView wvMonth;  
  40.     private WheelView wvDay;  
  41.   
  42.     private View vDialog;  
  43.     private View vDialogChild;  
  44.     private ViewGroup VDialogPicker;  
  45.     private TextView tvTitle;  
  46.     private TextView btnSure;  
  47.     private TextView btnCancel;  
  48.   
  49.     private ArrayList<String> arry_years = new ArrayList<String>();  
  50.     private ArrayList<String> arry_months = new ArrayList<String>();  
  51.     private ArrayList<String> arry_days = new ArrayList<String>();  
  52.     private CalendarTextAdapter mYearAdapter;  
  53.     private CalendarTextAdapter mMonthAdapter;  
  54.     private CalendarTextAdapter mDaydapter;  
  55.   
  56.     private int month;  
  57.     private int day;  
  58.   
  59.     private int currentYear = getYear();  
  60.     private int currentMonth = getMonth();  
  61.     private int currentDay = getDay();  
  62.   
  63.     private int maxTextSize = 24;  
  64.     private int minTextSize = 18;  
  65.   
  66.     private boolean issetdata = false;  
  67.   
  68.     private String selectYear;  
  69.     private String selectMonth;  
  70.     private String selectDay;  
  71.   
  72.     private String strTitle = "选择日期";  
  73.   
  74.     private OnDatePickListener onDatePickListener;  
  75.   
  76.     public DatePickerDialog(Context context) {  
  77.         super(context, R.layout.dialog_picker_center);  
  78.         this.context = context;  
  79.     }  
  80.   
  81.     @Override  
  82.     protected void onCreate(Bundle savedInstanceState) {  
  83.         // TODO Auto-generated method stub  
  84.         super.onCreate(savedInstanceState);  
  85.         init();  
  86.     }  
  87.   
  88.     private void init() {  
  89.         VDialogPicker = (ViewGroup) findViewById(R.id.ly_dialog_picker);  
  90.         LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(  
  91.                 LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 1.0f);  
  92.         // 此处相当于布局文件中的Android:layout_gravity属性  
  93.         lp.gravity = Gravity.CENTER_VERTICAL;  
  94.   
  95.         wvYear = new WheelView(context);  
  96.         wvYear.setLayoutParams(lp);  
  97.         VDialogPicker.addView(wvYear);  
  98.   
  99.         wvMonth = new WheelView(context);  
  100.         wvMonth.setLayoutParams(lp);  
  101.         VDialogPicker.addView(wvMonth);  
  102.   
  103.         wvDay = new WheelView(context);  
  104.         wvDay.setLayoutParams(lp);  
  105.         VDialogPicker.addView(wvDay);  
  106.   
  107.         vDialog = findViewById(R.id.ly_dialog);  
  108.         vDialogChild = findViewById(R.id.ly_dialog_child);  
  109.         tvTitle = (TextView) findViewById(R.id.tv_dialog_title);  
  110.         btnSure = (TextView) findViewById(R.id.btn_dialog_sure);  
  111.         btnCancel = (TextView) findViewById(R.id.btn_dialog_cancel);  
  112.   
  113.         tvTitle.setText(strTitle);  
  114.         vDialog.setOnClickListener(this);  
  115.         vDialogChild.setOnClickListener(this);  
  116.         btnSure.setOnClickListener(this);  
  117.         if (null != btnCancel) {  
  118.             btnCancel.setOnClickListener(this);  
  119.         }  
  120.   
  121.         if (!issetdata) {  
  122.             initData();  
  123.         }  
  124.         initYears();  
  125.         mYearAdapter = new CalendarTextAdapter(context, arry_years,  
  126.                 setYear(currentYear), maxTextSize, minTextSize);  
  127.         wvYear.setVisibleItems(5);  
  128.         wvYear.setViewAdapter(mYearAdapter);  
  129.         wvYear.setCurrentItem(setYear(currentYear));  
  130.   
  131.         initMonths(month);  
  132.         mMonthAdapter = new CalendarTextAdapter(context, arry_months,  
  133.                 setMonth(currentMonth), maxTextSize, minTextSize);  
  134.         wvMonth.setVisibleItems(5);  
  135.         wvMonth.setCyclic(true);  
  136.         wvMonth.setViewAdapter(mMonthAdapter);  
  137.         wvMonth.setCurrentItem(setMonth(currentMonth));  
  138.   
  139.         initDays(day);  
  140.         mDaydapter = new CalendarTextAdapter(context, arry_days,  
  141.                 currentDay - 1, maxTextSize, minTextSize);  
  142.         wvDay.setVisibleItems(5);  
  143.         wvDay.setCyclic(true);  
  144.         wvDay.setViewAdapter(mDaydapter);  
  145.         wvDay.setCurrentItem(currentDay - 1);  
  146.   
  147.         wvYear.addChangingListener(new OnWheelChangedListener() {  
  148.   
  149.             @Override  
  150.             public void onChanged(WheelView wheel, int oldValue, int newValue) {  
  151.                 // TODO Auto-generated method stub  
  152.                 String currentText = (String) mYearAdapter.getItemText(wheel  
  153.                         .getCurrentItem());  
  154.                 selectYear = currentText;  
  155.                 setTextviewSize(currentText, mYearAdapter);  
  156.                 currentYear = Integer.parseInt(currentText);  
  157.                 setYear(currentYear);  
  158.                 initMonths(month);  
  159.                 mMonthAdapter = new CalendarTextAdapter(context, arry_months,  
  160.                         0, maxTextSize, minTextSize);  
  161.                 wvMonth.setVisibleItems(5);  
  162.                 wvMonth.setViewAdapter(mMonthAdapter);  
  163.                 wvMonth.setCurrentItem(0);  
  164.             }  
  165.         });  
  166.   
  167.         wvYear.addScrollingListener(new OnWheelScrollListener() {  
  168.   
  169.             @Override  
  170.             public void onScrollingStarted(WheelView wheel) {  
  171.                 // TODO Auto-generated method stub  
  172.   
  173.             }  
  174.   
  175.             @Override  
  176.             public void onScrollingFinished(WheelView wheel) {  
  177.                 // TODO Auto-generated method stub  
  178.                 String currentText = (String) mYearAdapter.getItemText(wheel  
  179.                         .getCurrentItem());  
  180.                 setTextviewSize(currentText, mYearAdapter);  
  181.             }  
  182.         });  
  183.   
  184.         wvMonth.addChangingListener(new OnWheelChangedListener() {  
  185.   
  186.             @Override  
  187.             public void onChanged(WheelView wheel, int oldValue, int newValue) {  
  188.                 // TODO Auto-generated method stub  
  189.                 String currentText = (String) mMonthAdapter.getItemText(wheel  
  190.                         .getCurrentItem());  
  191.                 selectMonth = currentText;  
  192.                 setTextviewSize(currentText, mMonthAdapter);  
  193.                 setMonth(Integer.parseInt(currentText));  
  194.                 initDays(day);  
  195.                 mDaydapter = new CalendarTextAdapter(context, arry_days, 0,  
  196.                         maxTextSize, minTextSize);  
  197.                 wvDay.setVisibleItems(5);  
  198.                 wvDay.setViewAdapter(mDaydapter);  
  199.                 wvDay.setCurrentItem(0);  
  200.             }  
  201.         });  
  202.   
  203.         wvMonth.addScrollingListener(new OnWheelScrollListener() {  
  204.   
  205.             @Override  
  206.             public void onScrollingStarted(WheelView wheel) {  
  207.                 // TODO Auto-generated method stub  
  208.   
  209.             }  
  210.   
  211.             @Override  
  212.             public void onScrollingFinished(WheelView wheel) {  
  213.                 // TODO Auto-generated method stub  
  214.                 String currentText = (String) mMonthAdapter.getItemText(wheel  
  215.                         .getCurrentItem());  
  216.                 setTextviewSize(currentText, mMonthAdapter);  
  217.             }  
  218.         });  
  219.   
  220.         wvDay.addChangingListener(new OnWheelChangedListener() {  
  221.   
  222.             @Override  
  223.             public void onChanged(WheelView wheel, int oldValue, int newValue) {  
  224.                 // TODO Auto-generated method stub  
  225.                 String currentText = (String) mDaydapter.getItemText(wheel  
  226.                         .getCurrentItem());  
  227.                 setTextviewSize(currentText, mDaydapter);  
  228.                 selectDay = currentText;  
  229.             }  
  230.         });  
  231.   
  232.         wvDay.addScrollingListener(new OnWheelScrollListener() {  
  233.   
  234.             @Override  
  235.             public void onScrollingStarted(WheelView wheel) {  
  236.                 // TODO Auto-generated method stub  
  237.   
  238.             }  
  239.   
  240.             @Override  
  241.             public void onScrollingFinished(WheelView wheel) {  
  242.                 // TODO Auto-generated method stub  
  243.                 String currentText = (String) mDaydapter.getItemText(wheel  
  244.                         .getCurrentItem());  
  245.                 setTextviewSize(currentText, mDaydapter);  
  246.             }  
  247.         });  
  248.   
  249.     }  
  250.   
  251.     public void initData() {  
  252.         setDate(getYear(), getMonth(), getDay());  
  253.     }  
  254.   
  255.     public void initYears() {  
  256.         for (int i = MIN_YEAR; i < MAX_YEAR; i++) {  
  257.             arry_years.add(i + "");  
  258.         }  
  259.     }  
  260.   
  261.     public void initMonths(int months) {  
  262.         arry_months.clear();  
  263.         for (int i = 1; i <= months; i++) {  
  264.             arry_months.add(i + "");  
  265.         }  
  266.     }  
  267.   
  268.     public void initDays(int days) {  
  269.         arry_days.clear();  
  270.         for (int i = 1; i <= days; i++) {  
  271.             arry_days.add(i + "");  
  272.         }  
  273.     }  
  274.   
  275.     /** 
  276.      * 设置dialog弹出框模式 
  277.      *  
  278.      * @param dialogMode 
  279.      * @param DIALOG_MODE_CENTER 
  280.      *            从屏幕中间弹出 
  281.      * @param DIALOG_MODE_BOTTOM 
  282.      *            从屏幕底部弹出 
  283.      */  
  284.     public void setDialogMode(int dialogMode) {  
  285.         if (dialogMode == DIALOG_MODE_BOTTOM) {  
  286.             resetContent(R.layout.dialog_picker_bottom);  
  287.             setAnimation(R.style.AnimationBottomDialog);  
  288.             setGravity(Gravity.BOTTOM);  
  289.         }  
  290.     }  
  291.   
  292.     public void setTitle(String title) {  
  293.         this.strTitle = title;  
  294.     }  
  295.   
  296.     @Override  
  297.     protected int dialogWidth() {  
  298.         DisplayMetrics metric = new DisplayMetrics();  
  299.         ((Activity) mContext).getWindowManager().getDefaultDisplay()  
  300.                 .getMetrics(metric);  
  301.         return metric.widthPixels;  
  302.     }  
  303.   
  304.     public void setDatePickListener(OnDatePickListener onDatePickListener) {  
  305.         this.onDatePickListener = onDatePickListener;  
  306.     }  
  307.   
  308.     @Override  
  309.     public void onClick(View v) {  
  310.   
  311.         if (v == btnSure) {  
  312.             if (onDatePickListener != null) {  
  313.                 onDatePickListener.onClick(selectYear, selectMonth, selectDay);  
  314.             }  
  315.         } else if (v == btnCancel) {  
  316.   
  317.         } else if (v == vDialogChild) {  
  318.             return;  
  319.         } else {  
  320.             dismiss();  
  321.         }  
  322.         dismiss();  
  323.     }  
  324.   
  325.     public interface OnDatePickListener {  
  326.         public void onClick(String year, String month, String day);  
  327.     }  
  328.   
  329.     /** 
  330.      * 设置字体大小 
  331.      *  
  332.      * @param curriteItemText 
  333.      * @param adapter 
  334.      */  
  335.     public void setTextviewSize(String curriteItemText,  
  336.             CalendarTextAdapter adapter) {  
  337.         ArrayList<View> arrayList = adapter.getTestViews();  
  338.         int size = arrayList.size();  
  339.         String currentText;  
  340.         for (int i = 0; i < size; i++) {  
  341.             TextView textvew = (TextView) arrayList.get(i);  
  342.             currentText = textvew.getText().toString();  
  343.             if (curriteItemText.equals(currentText)) {  
  344.                 textvew.setTextSize(maxTextSize);  
  345.             } else {  
  346.                 textvew.setTextSize(minTextSize);  
  347.             }  
  348.         }  
  349.     }  
  350.   
  351.     public int getYear() {  
  352.         Calendar c = Calendar.getInstance();  
  353.         return c.get(Calendar.YEAR);  
  354.     }  
  355.   
  356.     public int getMonth() {  
  357.         Calendar c = Calendar.getInstance();  
  358.         return c.get(Calendar.MONTH) + 1;  
  359.     }  
  360.   
  361.     public int getDay() {  
  362.         Calendar c = Calendar.getInstance();  
  363.         return c.get(Calendar.DATE);  
  364.     }  
  365.   
  366.     /** 
  367.      * 设置年月日 
  368.      *  
  369.      * @param year 
  370.      * @param month 
  371.      * @param day 
  372.      */  
  373.     public void setDate(int year, int month, int day) {  
  374.         selectYear = year + "";  
  375.         selectMonth = month + "";  
  376.         selectDay = day + "";  
  377.         issetdata = true;  
  378.         this.currentYear = year;  
  379.         this.currentMonth = month;  
  380.         this.currentDay = day;  
  381.         this.month = 12;  
  382.         calDays(year, month);  
  383.     }  
  384.   
  385.     /** 
  386.      * 设置年份 
  387.      *  
  388.      * @param year 
  389.      */  
  390.     private int setYear(int year) {  
  391.         int yearIndex = 0;  
  392.         for (int i = MIN_YEAR; i < MAX_YEAR; i++) {  
  393.             if (i == year) {  
  394.                 return yearIndex;  
  395.             }  
  396.             yearIndex++;  
  397.         }  
  398.         return yearIndex;  
  399.     }  
  400.   
  401.     /** 
  402.      * 设置月份 
  403.      *  
  404.      * @param year 
  405.      * @param month 
  406.      * @return 
  407.      */  
  408.     private int setMonth(int month) {  
  409.         int monthIndex = 0;  
  410.         calDays(currentYear, month);  
  411.         for (int i = 1; i < this.month; i++) {  
  412.             if (month == i) {  
  413.                 return monthIndex;  
  414.             } else {  
  415.                 monthIndex++;  
  416.             }  
  417.         }  
  418.         return monthIndex;  
  419.     }  
  420.   
  421.     /** 
  422.      * 计算每月多少天 
  423.      *  
  424.      * @param month 
  425.      * @param leayyear 
  426.      */  
  427.     public void calDays(int year, int month) {  
  428.         boolean leayyear = false;  
  429.         if (year % 4 == 0 && year % 100 != 0) {  
  430.             leayyear = true;  
  431.         } else {  
  432.             leayyear = false;  
  433.         }  
  434.         for (int i = 1; i <= 12; i++) {  
  435.             switch (month) {  
  436.             case 1:  
  437.             case 3:  
  438.             case 5:  
  439.             case 7:  
  440.             case 8:  
  441.             case 10:  
  442.             case 12:  
  443.                 this.day = 31;  
  444.                 break;  
  445.             case 2:  
  446.                 if (leayyear) {  
  447.                     this.day = 29;  
  448.                 } else {  
  449.                     this.day = 28;  
  450.                 }  
  451.                 break;  
  452.             case 4:  
  453.             case 6:  
  454.             case 9:  
  455.             case 11:  
  456.                 this.day = 30;  
  457.                 break;  
  458.             }  
  459.         }  
  460.         if (year == getYear() && month == getMonth()) {  
  461.             this.day = getDay();  
  462.         }  
  463.     }  
  464.   
  465.     private class CalendarTextAdapter extends AbstractWheelTextAdapter {  
  466.         ArrayList<String> list;  
  467.   
  468.         protected CalendarTextAdapter(Context context, ArrayList<String> list,  
  469.                 int currentItem, int maxsize, int minsize) {  
  470.             super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem,  
  471.                     maxsize, minsize);  
  472.             this.list = list;  
  473.             setItemTextResource(R.id.tempValue);  
  474.         }  
  475.   
  476.         @Override  
  477.         public View getItem(int index, View cachedView, ViewGroup parent) {  
  478.             View view = super.getItem(index, cachedView, parent);  
  479.             return view;  
  480.         }  
  481.   
  482.         @Override  
  483.         public int getItemsCount() {  
  484.             return list.size();  
  485.         }  
  486.   
  487.         @Override  
  488.         protected CharSequence getItemText(int index) {  
  489.             return list.get(index) + "";  
  490.         }  
  491.     }  
  492.   
  493. }  

DEMO下载地址:http://download.csdn.net/download/pengjian1993/9084995
0 0
原创粉丝点击