自定义Dialog:双日期选择器

来源:http://gundumw100.iteye.com/blog/1407278

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

这里写图片描述

package qianlong.qlmobile.view;

import qianlong.qlmobile.tablet.yinhe.hk.R;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;

public class DatePickerDialog extends Dialog implements OnDateChangedListener{

    private Context context;
    private Button apply,cancel;
    private DatePicker startDatePicker,endDatePicker;

    private int start_year;
    private int start_monthOfYear;
    private int start_dayOfMonth;
    private int end_year;
    private int end_monthOfYear;
    private int end_dayOfMonth;
    public DatePickerDialog(Context context,
            int start_year,
            int start_monthOfYear,
            int start_dayOfMonth,
            int end_year,
            int end_monthOfYear,
            int end_dayOfMonth
            ) {
        super(context);
        // TODO Auto-generated constructor stub
        this.context=context;
        this.start_year=start_year;
        this.start_monthOfYear=start_monthOfYear;
        this.start_dayOfMonth=start_dayOfMonth;
        this.end_year=end_year;
        this.end_monthOfYear=end_monthOfYear;
        this.end_dayOfMonth=end_dayOfMonth;

        init();
    }
    public DatePickerDialog(Context context,int theme,
            int start_year,
            int start_monthOfYear,
            int start_dayOfMonth,
            int end_year,
            int end_monthOfYear,
            int end_dayOfMonth
            ) {
        super(context);
        // TODO Auto-generated constructor stub
        this.context=context;
        this.start_year=start_year;
        this.start_monthOfYear=start_monthOfYear;
        this.start_dayOfMonth=start_dayOfMonth;
        this.end_year=end_year;
        this.end_monthOfYear=end_monthOfYear;
        this.end_dayOfMonth=end_dayOfMonth;
        init();
    }

    private void init(){
//      this.setCanceledOnTouchOutside(true);
        this.setCancelable(true);
        this.setTitle("日期选择器");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ipo_dialog_date_picker);

        initViews();
        initValues();
    }

    private void initViews(){
        apply=(Button)findViewById(R.id.apply);
        apply.setOnClickListener(clickListener);
        cancel=(Button)findViewById(R.id.cancel);
        cancel.setOnClickListener(clickListener);

        startDatePicker=(DatePicker)findViewById(R.id.startDatePicker);
        endDatePicker=(DatePicker)findViewById(R.id.endDatePicker);
    }
    private void initValues(){
        startDatePicker.init(start_year, start_monthOfYear, start_dayOfMonth, this);
        endDatePicker.init(end_year, end_monthOfYear, end_dayOfMonth, this);
    }

    private Button.OnClickListener clickListener=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
            case R.id.apply:
                if(onDateSetListener!=null){
                    onDateSetListener.onDateSet(
                            start_year, start_monthOfYear, start_dayOfMonth,
                            end_year, end_monthOfYear, end_dayOfMonth
                            );
                }
                dismiss();
                break;
            case R.id.cancel:
                dismiss();
                break;

            default:
                break;
            }
        }
    };

    private OnDateSetListener onDateSetListener;
    public interface OnDateSetListener {
        void onDateSet(
                int start_year,
                int start_monthOfYear,
                int start_dayOfMonth,
                int end_year,
                int end_monthOfYear,
                int end_dayOfMonth
                );
    }
    public void setOnDateSetListener(OnDateSetListener onDateSetListener){
        this.onDateSetListener=onDateSetListener;
    }
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        // TODO Auto-generated method stub
        if(view==startDatePicker){
            this.start_year=year;
            this.start_monthOfYear=monthOfYear;
            this.start_dayOfMonth=dayOfMonth;
        }else if(view==endDatePicker){
            this.end_year=year;
            this.end_monthOfYear=monthOfYear;
            this.end_dayOfMonth=dayOfMonth;
        }
//      updateDate(view,year,monthOfYear,dayOfMonth);

    }

//  public void updateDate(
//          DatePicker view, int year, int monthOfYear,int dayOfMonth){
//      view.updateDate(year, monthOfYear, dayOfMonth);
//  }

}

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

ipo_dialog_date_picker.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    <LinearLayout
        android:orientation="horizontal"
       android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        >
            <TextView 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="开始时间:"
            android:textSize="@dimen/font_middler"
            android:textColor="@color/white"
            android:gravity="center"
            />
            <DatePicker
            android:id="@+id/startDatePicker"
            android:padding="5dip"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        </LinearLayout>
        <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:layout_marginLeft="5dip"
        >
            <TextView 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="结束时间:"
            android:textSize="@dimen/font_middler"
            android:textColor="@color/white"
            android:gravity="center"
            />
            <DatePicker
            android:id="@+id/endDatePicker"
            android:padding="5dip"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        </LinearLayout>
    </LinearLayout>
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:layout_marginTop="20dip"
    >
         <Button android:id="@+id/apply"
            android:layout_width="100dip"
            android:layout_height="wrap_content"
            android:text="确认"
            android:textSize="@dimen/font_middler"
            />
         <Button android:id="@+id/cancel"
            android:layout_width="100dip"
            android:layout_height="wrap_content"
            android:text="取消"
            android:textSize="@dimen/font_middler"
            android:layout_marginLeft="20dip"
            />
    </LinearLayout>
</LinearLayout>

用法:

private Calendar calendar_start = Calendar.getInstance();
private Calendar calendar_end = Calendar.getInstance();

//在需要的地方填入如下代码(通常是在Button的click事件中.)
qianlong.qlmobile.view.DatePickerDialog d=new qianlong.qlmobile.view.DatePickerDialog(
                            HK_TradeIPOActivity.this.getParent(),
                            calendar_start.get(Calendar.YEAR),
                            calendar_start.get(Calendar.MONTH),
                            calendar_start.get(Calendar.DAY_OF_MONTH),
                            calendar_end.get(Calendar.YEAR),
                            calendar_end.get(Calendar.MONTH),
                            calendar_end.get(Calendar.DAY_OF_MONTH)
                            );
                d.setOnDateSetListener(onDateSetListener);
                d.show();



//自己实现需要的功能
private qianlong.qlmobile.view.DatePickerDialog.OnDateSetListener onDateSetListener=new qianlong.qlmobile.view.DatePickerDialog.OnDateSetListener(){

        @Override
        public void onDateSet(int start_year,
                int start_monthOfYear,
                int start_dayOfMonth,
                int end_year,
                int end_monthOfYear,
                int end_dayOfMonth) {
            // TODO Auto-generated method stub

            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");

            calendar_start.set(Calendar.YEAR, start_year);
            calendar_start.set(Calendar.MONTH, start_monthOfYear);
            calendar_start.set(Calendar.DAY_OF_MONTH, start_dayOfMonth);


            calendar_end.set(Calendar.YEAR, end_year);
            calendar_end.set(Calendar.MONTH, end_monthOfYear);
            calendar_end.set(Calendar.DAY_OF_MONTH, end_dayOfMonth);

String startDate=simpleDateFormat.format(calendar_start.getTime());
String endDate=simpleDateFormat.format(calendar_end.getTime());
            //doSomething(startDate,endDate)    


        }

    };

Android开发之日历控件实现
http://www.cnblogs.com/hanyonglu/archive/2012/03/26/2418178.html

Js日历控件,在一个网页上同时显示两个日期选择器,写成了封装类,方便使用者调用。同时美化的相当不错。   包括了以下函数:   1、2012——2020年节假日信息(包括节假日前1~3天/后1~3天)   2、格式化数字,不足两位前面补0   3、将日期对象/日期字会串格式化为指定日期字符串   4、将日期字符串格式化为数字   5、获取目标元素针对于文档的位置   6、元素选择器   7、查找元素位置   8、判断目标元素是否包含指定的className      关于一些日历调用的参数说明:Calendar({    id: "#J_date_1", //触发显示日历元素ID    isPopup: !0, //弹式日历    isPrevBtn: !0, //显示上月按钮    isNextBtn: !0, //显示下月按钮    isCloseBtn: !0, //显示关闭按钮    isHoliday: !0, //节假日特殊显示    isHolidayTips: !0, //显示节假日1~3天/后1~3天信息    isDateInfo: !0, //显示日期信息    isMessage: !0, //有日历提示信息    isCalStart: !0, //标记为开始时间    dateInfoClass: "date-info-start", //开始时间icon样式    range: {mindate: "2011-09-01", maxdate: "2020-12-31"},//限制范围(当天——2020-12-31)    count: 2, //日历个数    monthStep: 1, //切换上下月日历步长    onSelectDate: fnSelectDate, //选择日期回调方法    onClose: fnClose //关闭日历回调方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值