package com.kaixin.android.view; import java.util.Arrays; import java.util.Calendar; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import com.kaixin.android.R; import com.kaixin.android.adapter.NumericWheelAdapter; import com.kaixin.android.adapter.OnWheelChangedListener; /** * @auther:summer 时间: 2012-7-19 下午2:59:56 */ public class MyDateTimePickerDialog extends AlertDialog implements OnClickListener { private static int START_YEAR = 1970, END_YEAR = 2100; private final OnDateTimeSetListener mCallBack; private int curr_year, curr_month, curr_day; // 添加大小月月份并将其转换为list,方便之后的判断 String[] months_big = { "1", "3", "5", "7", "8", "10", "12" }; String[] months_little = { "4", "6", "9", "11" }; final WheelView wv_year, wv_month, wv_day; final List<String> list_big, list_little; public MyDateTimePickerDialog(Context context, Calendar calender, OnDateTimeSetListener callBack) { super(context); this.START_YEAR = START_YEAR; int year = calender.get(Calendar.YEAR); int month = calender.get(Calendar.MONTH); int day = calender.get(Calendar.DATE); // int hour = mCalendar.get(Calendar.HOUR_OF_DAY); // int minute = mCalendar.get(Calendar.MINUTE); this.END_YEAR = END_YEAR; mCallBack = callBack; list_big = Arrays.asList(months_big); list_little = Arrays.asList(months_little); setButton(context.getText(R.string.call_ok_txt), this); setButton2(context.getText(R.string.call_exit_txt), (OnClickListener) null); setTitle("请选择出生日期"); // 找到dialog的布局文件 LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.time_layout, null); int textSize = 0; textSize = adjustFontSize(getWindow().getWindowManager()); // 年 wv_year = (WheelView) view.findViewById(R.id.year); wv_year.setAdapter(new NumericWheelAdapter(START_YEAR, END_YEAR));// 设置"年"的显示数据 wv_year.setCyclic(true);// 可循环滚动 wv_year.setLabel("年");// 添加文字 wv_year.setCurrentItem(year - START_YEAR);// 初始化时显示的数据 // 月 wv_month = (WheelView) view.findViewById(R.id.month); wv_month.setAdapter(new NumericWheelAdapter(1, 12)); wv_month.setCyclic(true); wv_month.setLabel("月"); wv_month.setCurrentItem(month); // 日 wv_day = (WheelView) view.findViewById(R.id.day); wv_day.setCyclic(true); // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(month + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 30)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) wv_day.setAdapter(new NumericWheelAdapter(1, 29)); else wv_day.setAdapter(new NumericWheelAdapter(1, 28)); } wv_day.setLabel("日"); wv_day.setCurrentItem(day - 1); // 时 /*wv_hours = (WheelView) view.findViewById(R.id.hour); wv_hours.setAdapter(new NumericWheelAdapter(0, 23)); wv_hours.setCyclic(true); wv_hours.setCurrentItem(hour); // 分 wv_mins = (WheelView) view.findViewById(R.id.mins); wv_mins.setAdapter(new NumericWheelAdapter(0, 59, "%02d")); wv_mins.setCyclic(true); wv_mins.setCurrentItem(minute);*/ // 添加"年"监听 OnWheelChangedListener wheelListener_year = new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { int year_num = newValue + START_YEAR; // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big .contains(String.valueOf(wv_month.getCurrentItem() + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(wv_month .getCurrentItem() + 1))) { wv_day.setAdapter(new NumericWheelAdapter(1, 30)); } else { if ((year_num % 4 == 0 && year_num % 100 != 0) || year_num % 400 == 0) wv_day.setAdapter(new NumericWheelAdapter(1, 29)); else wv_day.setAdapter(new NumericWheelAdapter(1, 28)); } } }; // 添加"月"监听 OnWheelChangedListener wheelListener_month = new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { int month_num = newValue + 1; // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(month_num))) { wv_day.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(month_num))) { wv_day.setAdapter(new NumericWheelAdapter(1, 30)); } else { if (((wv_year.getCurrentItem() + START_YEAR) % 4 == 0 && (wv_year .getCurrentItem() + START_YEAR) % 100 != 0) || (wv_year.getCurrentItem() + START_YEAR) % 400 == 0) wv_day.setAdapter(new NumericWheelAdapter(1, 29)); else wv_day.setAdapter(new NumericWheelAdapter(1, 28)); } } }; wv_year.addChangingListener(wheelListener_year); wv_month.addChangingListener(wheelListener_month); wv_day.TEXT_SIZE = textSize; // wv_hours.TEXT_SIZE = textSize; // wv_mins.TEXT_SIZE = textSize; wv_month.TEXT_SIZE = textSize; wv_year.TEXT_SIZE = textSize; setView(view); } public void onClick(DialogInterface dialog, int which) { curr_year = wv_year.getCurrentItem() + START_YEAR; curr_month = wv_month.getCurrentItem() + 1; curr_day = wv_day.getCurrentItem() + 1; // curr_hour = wv_hours.getCurrentItem(); // curr_minute = wv_mins.getCurrentItem(); if (mCallBack != null) { mCallBack.onDateTimeSet(curr_year, curr_month, curr_day); } } public void show() { super.show(); } public interface OnDateTimeSetListener { void onDateTimeSet(int year, int monthOfYear, int dayOfMonth); } public static int adjustFontSize(WindowManager windowmanager) { int screenWidth = windowmanager.getDefaultDisplay().getWidth(); int screenHeight = windowmanager.getDefaultDisplay().getHeight(); /* * DisplayMetrics dm = new DisplayMetrics(); dm = * windowmanager.getApplicationContext * ().getResources().getDisplayMetrics(); int widthPixels = * dm.widthPixels; int heightPixels = dm.heightPixels; float density = * dm.density; fullScreenWidth = (int)(widthPixels * density); * fullScreenHeight = (int)(heightPixels * density); */ if (screenWidth <= 240) { // 240X320 屏幕 return 10; } else if (screenWidth <= 320) { // 320X480 屏幕 return 14; } else if (screenWidth <= 480) { // 480X800 或 480X854 屏幕 return 24; } else if (screenWidth <= 540) { // 540X960 屏幕 return 26; } else if (screenWidth <= 800) { // 800X1280 屏幕 return 30; } else { // 大于 800X1280 return 30; } } }