自定义Dialog:双日期选择器

来源:互联网 发布:vb中and和or的优先级 编辑:程序博客网 时间:2024/04/28 06:23

系统自带的DatePickerDialog只能一次性选择一个日期,有时候我们需要这样的功能:需要录入2个日期,比如开始日期和结束日期,如果采用DatePickerDialog需要弹出2次Dialog,能不能一次就搞定呢?那就需要下面的内容了。 
自定义一个DatePickerDialog,实现OnDateChangedListener接口,里面有2个DatePicker,然后分别对这2个DatePicker设置日期就行了。 

 

Java代码  收藏代码
  1. package qianlong.qlmobile.view;  
  2.   
  3. import qianlong.qlmobile.tablet.yinhe.hk.R;  
  4. import android.app.Dialog;  
  5. import android.content.Context;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.DatePicker;  
  10. import android.widget.DatePicker.OnDateChangedListener;  
  11.   
  12. public class DatePickerDialog extends Dialog implements OnDateChangedListener{  
  13.   
  14.     private Context context;  
  15.     private Button apply,cancel;  
  16.     private DatePicker startDatePicker,endDatePicker;  
  17.       
  18.     private int start_year;  
  19.     private int start_monthOfYear;  
  20.     private int start_dayOfMonth;  
  21.     private int end_year;  
  22.     private int end_monthOfYear;  
  23.     private int end_dayOfMonth;  
  24.     public DatePickerDialog(Context context,  
  25.             int start_year,  
  26.             int start_monthOfYear,  
  27.             int start_dayOfMonth,  
  28.             int end_year,  
  29.             int end_monthOfYear,  
  30.             int end_dayOfMonth  
  31.             ) {  
  32.         super(context);  
  33.         // TODO Auto-generated constructor stub  
  34.         this.context=context;  
  35.         this.start_year=start_year;  
  36.         this.start_monthOfYear=start_monthOfYear;  
  37.         this.start_dayOfMonth=start_dayOfMonth;  
  38.         this.end_year=end_year;  
  39.         this.end_monthOfYear=end_monthOfYear;  
  40.         this.end_dayOfMonth=end_dayOfMonth;  
  41.           
  42.         init();  
  43.     }  
  44.     public DatePickerDialog(Context context,int theme,  
  45.             int start_year,  
  46.             int start_monthOfYear,  
  47.             int start_dayOfMonth,  
  48.             int end_year,  
  49.             int end_monthOfYear,  
  50.             int end_dayOfMonth  
  51.             ) {  
  52.         super(context);  
  53.         // TODO Auto-generated constructor stub  
  54.         this.context=context;  
  55.         this.start_year=start_year;  
  56.         this.start_monthOfYear=start_monthOfYear;  
  57.         this.start_dayOfMonth=start_dayOfMonth;  
  58.         this.end_year=end_year;  
  59.         this.end_monthOfYear=end_monthOfYear;  
  60.         this.end_dayOfMonth=end_dayOfMonth;  
  61.         init();  
  62.     }  
  63.   
  64.     private void init(){  
  65. //      this.setCanceledOnTouchOutside(true);  
  66.         this.setCancelable(true);  
  67.         this.setTitle("日期选择器");  
  68.     }  
  69.       
  70.     @Override  
  71.     protected void onCreate(Bundle savedInstanceState) {  
  72.         // TODO Auto-generated method stub  
  73.         super.onCreate(savedInstanceState);  
  74.         setContentView(R.layout.ipo_dialog_date_picker);  
  75.           
  76.         initViews();  
  77.         initValues();  
  78.     }  
  79.       
  80.     private void initViews(){  
  81.         apply=(Button)findViewById(R.id.apply);  
  82.         apply.setOnClickListener(clickListener);  
  83.         cancel=(Button)findViewById(R.id.cancel);  
  84.         cancel.setOnClickListener(clickListener);  
  85.           
  86.         startDatePicker=(DatePicker)findViewById(R.id.startDatePicker);  
  87.         endDatePicker=(DatePicker)findViewById(R.id.endDatePicker);  
  88.     }  
  89.     private void initValues(){  
  90.         startDatePicker.init(start_year, start_monthOfYear, start_dayOfMonth, this);  
  91.         endDatePicker.init(end_year, end_monthOfYear, end_dayOfMonth, this);  
  92.     }  
  93.       
  94.     private Button.OnClickListener clickListener=new Button.OnClickListener(){  
  95.   
  96.         @Override  
  97.         public void onClick(View v) {  
  98.             // TODO Auto-generated method stub  
  99.             switch (v.getId()) {  
  100.             case R.id.apply:  
  101.                 if(onDateSetListener!=null){  
  102.                     onDateSetListener.onDateSet(  
  103.                             start_year, start_monthOfYear, start_dayOfMonth,  
  104.                             end_year, end_monthOfYear, end_dayOfMonth  
  105.                             );  
  106.                 }  
  107.                 dismiss();  
  108.                 break;  
  109.             case R.id.cancel:  
  110.                 dismiss();  
  111.                 break;  
  112.   
  113.             default:  
  114.                 break;  
  115.             }  
  116.         }  
  117.     };  
  118.       
  119.     private OnDateSetListener onDateSetListener;  
  120.     public interface OnDateSetListener {  
  121.         void onDateSet(  
  122.                 int start_year,  
  123.                 int start_monthOfYear,  
  124.                 int start_dayOfMonth,  
  125.                 int end_year,  
  126.                 int end_monthOfYear,  
  127.                 int end_dayOfMonth  
  128.                 );  
  129.     }  
  130.     public void setOnDateSetListener(OnDateSetListener onDateSetListener){  
  131.         this.onDateSetListener=onDateSetListener;  
  132.     }  
  133.     @Override  
  134.     public void onDateChanged(DatePicker view, int year, int monthOfYear,  
  135.             int dayOfMonth) {  
  136.         // TODO Auto-generated method stub  
  137.         if(view==startDatePicker){  
  138.             this.start_year=year;  
  139.             this.start_monthOfYear=monthOfYear;  
  140.             this.start_dayOfMonth=dayOfMonth;  
  141.         }else if(view==endDatePicker){  
  142.             this.end_year=year;  
  143.             this.end_monthOfYear=monthOfYear;  
  144.             this.end_dayOfMonth=dayOfMonth;  
  145.         }  
  146. //      updateDate(view,year,monthOfYear,dayOfMonth);  
  147.           
  148.     }  
  149.       
  150. //  public void updateDate(  
  151. //          DatePicker view, int year, int monthOfYear,int dayOfMonth){  
  152. //      view.updateDate(year, monthOfYear, dayOfMonth);  
  153. //  }  
  154.       
  155. }  

我只是简单的实现了一下,更多的扩展请大家添上。 

ipo_dialog_date_picker.xml如下: 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="wrap_content"  
  5.     android:layout_height="wrap_content"  
  6.     >  
  7.     <LinearLayout  
  8.         android:orientation="horizontal"  
  9.        android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         >  
  12.         <LinearLayout  
  13.         android:orientation="vertical"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="fill_parent"  
  16.         android:layout_weight="1"  
  17.         >  
  18.             <TextView   
  19.             android:layout_width="fill_parent"  
  20.             android:layout_height="wrap_content"  
  21.             android:text="开始时间:"  
  22.             android:textSize="@dimen/font_middler"  
  23.             android:textColor="@color/white"  
  24.             android:gravity="center"  
  25.             />  
  26.             <DatePicker  
  27.             android:id="@+id/startDatePicker"  
  28.             android:padding="5dip"  
  29.             android:layout_gravity="center_horizontal"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             />  
  33.         </LinearLayout>  
  34.         <LinearLayout  
  35.         android:orientation="vertical"  
  36.         android:layout_width="fill_parent"  
  37.         android:layout_height="fill_parent"  
  38.         android:layout_weight="1"  
  39.         android:layout_marginLeft="5dip"  
  40.         >  
  41.             <TextView   
  42.             android:layout_width="fill_parent"  
  43.             android:layout_height="wrap_content"  
  44.             android:text="结束时间:"  
  45.             android:textSize="@dimen/font_middler"  
  46.             android:textColor="@color/white"  
  47.             android:gravity="center"  
  48.             />  
  49.             <DatePicker  
  50.             android:id="@+id/endDatePicker"  
  51.             android:padding="5dip"  
  52.             android:layout_gravity="center_horizontal"  
  53.             android:layout_width="wrap_content"  
  54.             android:layout_height="wrap_content"  
  55.             />  
  56.         </LinearLayout>  
  57.     </LinearLayout>  
  58.     <LinearLayout  
  59.     android:orientation="horizontal"  
  60.     android:layout_width="fill_parent"  
  61.     android:layout_height="wrap_content"  
  62.     android:gravity="center_horizontal"  
  63.     android:layout_marginTop="20dip"  
  64.     >  
  65.          <Button android:id="@+id/apply"  
  66.             android:layout_width="100dip"  
  67.             android:layout_height="wrap_content"  
  68.             android:text="确认"  
  69.             android:textSize="@dimen/font_middler"  
  70.             />  
  71.          <Button android:id="@+id/cancel"  
  72.             android:layout_width="100dip"  
  73.             android:layout_height="wrap_content"  
  74.             android:text="取消"  
  75.             android:textSize="@dimen/font_middler"  
  76.             android:layout_marginLeft="20dip"  
  77.             />  
  78.     </LinearLayout>  
  79. </LinearLayout>  


用法: 
Java代码  收藏代码
  1. private Calendar calendar_start = Calendar.getInstance();  
  2. private Calendar calendar_end = Calendar.getInstance();  
  3.   
  4. //在需要的地方填入如下代码(通常是在Button的click事件中.)  
  5. qianlong.qlmobile.view.DatePickerDialog d=new qianlong.qlmobile.view.DatePickerDialog(  
  6.                             HK_TradeIPOActivity.this.getParent(),  
  7.                             calendar_start.get(Calendar.YEAR),  
  8.                             calendar_start.get(Calendar.MONTH),  
  9.                             calendar_start.get(Calendar.DAY_OF_MONTH),  
  10.                             calendar_end.get(Calendar.YEAR),  
  11.                             calendar_end.get(Calendar.MONTH),  
  12.                             calendar_end.get(Calendar.DAY_OF_MONTH)  
  13.                             );  
  14.                 d.setOnDateSetListener(onDateSetListener);  
  15.                 d.show();  
  16.   
  17.   
  18.   
  19. //自己实现需要的功能  
  20. private qianlong.qlmobile.view.DatePickerDialog.OnDateSetListener onDateSetListener=new qianlong.qlmobile.view.DatePickerDialog.OnDateSetListener(){  
  21.   
  22.         @Override  
  23.         public void onDateSet(int start_year,  
  24.                 int start_monthOfYear,  
  25.                 int start_dayOfMonth,  
  26.                 int end_year,  
  27.                 int end_monthOfYear,  
  28.                 int end_dayOfMonth) {  
  29.             // TODO Auto-generated method stub  
  30.           
  31.             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");  
  32.               
  33.             calendar_start.set(Calendar.YEAR, start_year);  
  34.             calendar_start.set(Calendar.MONTH, start_monthOfYear);  
  35.             calendar_start.set(Calendar.DAY_OF_MONTH, start_dayOfMonth);  
  36.               
  37.               
  38.             calendar_end.set(Calendar.YEAR, end_year);  
  39.             calendar_end.set(Calendar.MONTH, end_monthOfYear);  
  40.             calendar_end.set(Calendar.DAY_OF_MONTH, end_dayOfMonth);  
  41.   
  42. String startDate=simpleDateFormat.format(calendar_start.getTime());  
  43. String endDate=simpleDateFormat.format(calendar_end.getTime());  
  44.             //doSomething(startDate,endDate)      
  45.               
  46.               
  47.         }  
  48.           
  49.     };  
原创粉丝点击