用AndroidWheel自定义DatePicker及DatePickerDialog

来源:互联网 发布:翻译文档软件 编辑:程序博客网 时间:2024/06/08 05:10

自定义DatePicker及DatePickerDialog

利用开源项目AndroidWheel,地址:https://code.google.com/p/android-wheel/,自定义DatePicker及DatePickerDialog

CustomDatePicker布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res/com.example.testapp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:gravity="center" >    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:gravity="center"        android:orientation="horizontal" >        <com.example.testapp.wheel.WheelVerticalView            android:id="@+id/year"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:unselectedAlpha="0.5"            app:visibleItems="4" />        <com.example.testapp.wheel.WheelVerticalView            android:id="@+id/month"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:unselectedAlpha="0.5"            app:visibleItems="4" />        <com.example.testapp.wheel.WheelVerticalView            android:id="@+id/day"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:unselectedAlpha="0.5"            app:visibleItems="4" />    </LinearLayout></LinearLayout>

CustomDatePicker代码

import java.util.ArrayList;import java.util.Calendar;import java.util.List;import com.example.testapp.R;import com.example.testapp.wheel.AbstractWheel;import com.example.testapp.wheel.AbstractWheelTextAdapter;import com.example.testapp.wheel.ArrayWheelAdapter;import com.example.testapp.wheel.OnWheelScrollListener;import com.example.testapp.wheel.WheelVerticalView;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.LinearLayout;import android.widget.Toast;public class CustomDatePicker extends LinearLayout {    private WheelVerticalView year;    private WheelVerticalView month;    private WheelVerticalView day;    private ChangingListener listener;    private ArrayWheelAdapter adapter3;    private Context context;    private Calendar select_date;    private Calendar now_date;    public CustomDatePicker(final Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;        View v = LayoutInflater.from(context).inflate(                R.layout.custom_datepicker, null);        year = (WheelVerticalView) v.findViewById(R.id.year);        month = (WheelVerticalView) v.findViewById(R.id.month);        day = (WheelVerticalView) v.findViewById(R.id.day);        ArrayList<String> yearlist = new ArrayList<String>();        ArrayList<String> monthlist = new ArrayList<String>();        for (int i = 1901; i < 2900; i++) {            yearlist.add(i + "年");        }        for (int i = 1; i <= 12; i++) {            monthlist.add(i + "月");        }        ArrayWheelAdapter adapter1 = new ArrayWheelAdapter(context,                yearlist.toArray());        ArrayWheelAdapter adapter2 = new ArrayWheelAdapter(context,                monthlist.toArray());        adapter3 = new ArrayWheelAdapter(context, getDaylist(31).toArray());        setTextColor(adapter1);        setTextColor(adapter2);        setTextColor(adapter3);        year.setViewAdapter(adapter1);        month.setViewAdapter(adapter2);        day.setViewAdapter(adapter3);        year.setCyclic(true);        month.setCyclic(true);        day.setCyclic(true);        setDate(Calendar.getInstance());        OnWheelScrollListener scrollListener = new OnWheelScrollListener() {            @Override            public void onScrollingStarted(AbstractWheel wheel) {                select_date = getDate();            }            @Override            public void onScrollingFinished(AbstractWheel wheel) {                if (now_date != null) {                    Calendar date = getDate();                    int compareTo = date.compareTo(now_date);                    if (compareTo < 0) {                        setDate(select_date);                        Toast.makeText(getContext(), "不能选择此日期",                                Toast.LENGTH_SHORT).show();                    }                }                setDayAdapter();            }        };        OnWheelScrollListener scrollListener1 = new OnWheelScrollListener() {            @Override            public void onScrollingStarted(AbstractWheel wheel) {                select_date = getDate();            }            @Override            public void onScrollingFinished(AbstractWheel wheel) {                if (now_date != null) {                    Calendar date = getDate();                    int compareTo = date.compareTo(now_date);                    if (compareTo < 0) {                        setDate(select_date);                        Toast.makeText(getContext(), "不能选择此日期",                                Toast.LENGTH_SHORT).show();                    }                }                doListener();            }        };        month.addScrollingListener(scrollListener);        year.addScrollingListener(scrollListener);        day.addScrollingListener(scrollListener1);        addView(v);    }    private List getDaylist(int num) {        ArrayList<String> list = new ArrayList<String>();        for (int i = 1; i <= num; i++) {            String d = i + "日";            if (i < 10) {                d = "\t" + i + "日";            }            list.add(d);        }        return list;    }    private void doListener() {        if (listener != null) {            listener.onChange(getDate());        }    }    public interface ChangingListener {        void onChange(Calendar c);    }    private void setDayAdapter() {        int currentItem = year.getCurrentItem();        int current = currentItem + 1901;        int newValue = month.getCurrentItem() + 1;        switch (newValue) {        case 1:        case 3:        case 5:        case 7:        case 8:        case 10:        case 12:            adapter3 = new ArrayWheelAdapter(context, getDaylist(31).toArray());            break;        case 2:            if (current % 4 == 0) {                adapter3 = new ArrayWheelAdapter(context, getDaylist(29)                        .toArray());            } else {                adapter3 = new ArrayWheelAdapter(context, getDaylist(28)                        .toArray());            }            break;        case 4:        case 6:        case 9:        case 11:            adapter3 = new ArrayWheelAdapter(context, getDaylist(30).toArray());            break;        default:            break;        }        day.setViewAdapter(adapter3);        setTextColor(adapter3);        doListener();    }    /**     * 设置初始日期     *      * @param c     */    public void setDate(Calendar c) {        int y = c.get(Calendar.YEAR);        int index1 = y - 1901;        year.setCurrentItem(index1);        int m = c.get(Calendar.MONTH);        month.setCurrentItem(m);        int d = c.get(Calendar.DAY_OF_MONTH);        setDayAdapter();        day.setCurrentItem(d - 1);    }    /**     * 设置字体颜色     *      * @param adapter     */    public void setTextColor(AbstractWheelTextAdapter adapter) {        adapter.setTextColor(context.getResources().getColor(R.color.blue));    }    /**     * 设置限制日期,设置后,不能选择设置的开始日期以前的日期     *      * @param c     */    public void setNowData(Calendar c) {        now_date = c;    }    /**     * 得到日期     *      * @return     */    public Calendar getDate() {        int y = year.getCurrentItem();        int index1 = y + 1901;        int m = month.getCurrentItem();        int d = day.getCurrentItem();        Calendar c = Calendar.getInstance();        c.set(index1, m, d + 1);        return c;    }    /**     * 设置日期改变的监听     *      * @param listener     */    public void addChangingListener(ChangingListener listener) {        this.listener = listener;    }}

CustomDatePickerDialog布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="270dp"    android:layout_height="wrap_content"    android:layout_centerInParent="true"    android:background="@drawable/white_round_shape"    android:orientation="vertical" >    <TextView        android:id="@+id/tv_dialog_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:padding="10dp"        android:text="请选择日期"        android:textColor="@color/black"        android:textSize="18sp" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="@color/blue" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:orientation="horizontal" >        <TextView            android:id="@+id/tv_dialog_content"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:padding="10dp"            android:text="2014年11月5日"            android:textColor="@color/black"            android:textSize="15sp" />    </LinearLayout>    <com.example.testapp.view.CustomDatePicker        android:id="@+id/cdp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center|right"        android:orientation="horizontal"        android:paddingBottom="10dp"        android:paddingLeft="10dp"        android:paddingRight="10dp"        android:paddingTop="10dp" >        <TextView            android:id="@+id/tv_cancel"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:gravity="center"            android:padding="10dp"            android:text="取消"            android:textColor="@color/yellow2gray_selector"            android:textSize="18sp" />        <TextView            android:id="@+id/tv_sure"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="10dp"            android:gravity="center"            android:padding="10dp"            android:text="确定"            android:textColor="@color/blue2gray_selector"            android:textSize="18sp" />    </LinearLayout></LinearLayout>

CustomDatePickerDialog代码

import java.text.SimpleDateFormat;import java.util.Calendar;import com.example.testapp.R;import com.example.testapp.view.CustomDatePicker.ChangingListener;import android.app.Dialog;import android.content.Context;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.View;import android.widget.TextView;public class CustomDatePickerDialog extends Dialog {    private TextView tv_sure;    private TextView tv_cancel;    private onDateListener listener;    private Calendar c = Calendar.getInstance();    private CustomDatePicker cdp;    public CustomDatePickerDialog(Context context, Calendar c) {        super(context, R.style.CustomDialog);        this.c = c;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.custom_datepicker_dialog);        getWindow().setBackgroundDrawable(new BitmapDrawable());        setCanceledOnTouchOutside(true);        TextView tv_dialog_title = (TextView) findViewById(R.id.tv_dialog_title);        final TextView tv_dialog_content = (TextView) findViewById(R.id.tv_dialog_content);        tv_sure = (TextView) findViewById(R.id.tv_sure);        tv_cancel = (TextView) findViewById(R.id.tv_cancel);        cdp = (CustomDatePicker) findViewById(R.id.cdp);        cdp.setDate(c);        SimpleDateFormat sdfFrom = new SimpleDateFormat("yyyy年MM月dd日 E");        String string = sdfFrom.format(c.getTime());        tv_dialog_content.setText(string);        cdp.addChangingListener(new ChangingListener() {            @Override            public void onChange(Calendar c1) {                c = c1;                SimpleDateFormat sdfFrom = new SimpleDateFormat("yyyy年MM月dd日 E");                String string = sdfFrom.format(c.getTime());                tv_dialog_content.setText(string);            }        });        View.OnClickListener clickListener = new View.OnClickListener() {            @Override            public void onClick(View v) {                if (v == tv_sure) {                    if (listener != null) {                        listener.dateFinish(c);                    }                }                dismiss();            }        };        tv_sure.setOnClickListener(clickListener);        tv_cancel.setOnClickListener(clickListener);    }    /**     * 设置限制日期,设置后,不能选择设置的开始日期以前的日期     *      * @param c     */    public void setNowData(Calendar c) {        cdp.setNowData(c);    }    /**     * 设置点击确认的事件     *      * @param listener     */    public void addDateListener(onDateListener listener) {        this.listener = listener;    }    public interface onDateListener {        void dateFinish(Calendar c);    }}

使用方法

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViewById(R.id.tv_click).setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                CustomDatePickerDialog dialog = new CustomDatePickerDialog(MainActivity.this, Calendar.getInstance());                dialog.addDateListener(new onDateListener() {                    @Override                    public void dateFinish(Calendar c) {                        Toast.makeText(getApplicationContext(), c.getTime().toLocaleString(), Toast.LENGTH_SHORT).show();                    }                });                dialog.show();            }        });        CustomDatePicker cdp = (CustomDatePicker) findViewById(R.id.cdp);        cdp.addChangingListener(new ChangingListener() {            @Override            public void onChange(Calendar c) {                Toast.makeText(getApplicationContext(), c.getTime().toLocaleString(), Toast.LENGTH_SHORT).show();            }        });    }

运行效果:

datapicker
datapickerdialog

示例代码下载地址:http://download.csdn.net/detail/u014580558/8528109

0 0
原创粉丝点击