Android使用GridView實現日曆功能(詳細程式碼)
轉自:http://blog.csdn.net/onlyonecoder/article/details/8481799
程式碼有點多,發個圖先:
如果懶得往下看的,可以直接下載原始碼吧(0分的),最近一直有人要,由於時間太久了,懶得找出來整理,今天又看到有人要,正好沒事就整理了一下
http://download.csdn.net/detail/onlyonecoder/6574379
佈局檔案:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/lay_title"
- style="@style/TitleStyle"
- android:layout_width="fill_parent" >
- <TextView
- android:id="@+id/btn_back"
- style="@style/TitleLeftButtonStyle" />
- <TextView
- android:id="@+id/tv_top"
- style="@style/TitleMiddleTextStyle"
- android:text="請選擇日期" />
- <TextView
- android:id="@+id/btn_goback_to_today"
- style="@style/TitleRightButtonStyle"
- android:text="今天" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="53.0dip"
- android:background="#ff394147"
- android:gravity="center_vertical" >
- <LinearLayout
- android:id="@+id/btn_prev_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/left_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle06_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.6"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tv_month"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="xxxx年14月"
- android:textColor="#ffffffff"
- android:textSize="21.0dip" />
- </LinearLayout>
- <LinearLayout
- android:id="@+id/btn_next_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/right_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle05_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="22.0dip"
- android:background="#ff8091a8" >
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週日"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週一"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週二"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週三"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週四"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週五"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="週六"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- </LinearLayout>
- <GridView
- android:id="@+id/gridview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#00000000"
- android:clickable="true"
- android:clipChildren="true"
- android:columnWidth="55.0dip"
- android:horizontalSpacing="1.0dip"
- android:listSelector="@null"
- android:numColumns="7"
- android:paddingBottom="1.0dip"
- android:stretchMode="columnWidth"
- android:verticalSpacing="1.0dip" />
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="#FFFFFF"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:gravity="center"
- android:layout_width="46dp"
- android:layout_height="55dp"
- android:id="@+id/tvtext"
- />
- </LinearLayout><strong><span style="font-size:32px;color:#ff0000;">
- </span></strong>
Adapter:
- /**
- * 日曆<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=gridview&ie=utf-8&src=se_lighten_f">gridview</a>中的每一個item顯示的textview
- * @author lmw
- *
- */
- public class CalendarAdapter extends BaseAdapter {
- private boolean isLeapyear = false; //是否為<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=%E9%97%B0%E5%B9%B4&ie=utf-8&src=se_lighten_f">閏年</a>
- private int daysOfMonth = 0; //某月的天數
- private int dayOfWeek = 0; //具體某一天是星期幾
- private int lastDaysOfMonth = 0; //上一個月的總天數
- private Context context;
- private String[] dayNumber = new String[42]; //一個gridview中的日期存入此<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=%E6%95%B0%E7%BB%84&ie=utf-8&src=se_lighten_f">陣列</a>中
- // private static String week[] = {"週日","週一","週二","週三","週四","週五","週六"};
- private SpecialCalendar sc = null;
- private LunarCalendar lc = null;
- private Resources res = null;
- private Drawable drawable = null;
- private String currentYear = "";
- private String currentMonth = "";
- private String currentDay = "";
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- private int currentFlag = -1; //用於標記當天
- private int[] schDateTagFlag = null; //儲存當月所有的日程日期
- private String showYear = ""; //用於在頭部顯示的年份
- private String showMonth = ""; //用於在頭部顯示的月份
- private String animalsYear = "";
- private String leapMonth = ""; //閏哪一個月
- private String cyclical = ""; //<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=%E5%A4%A9%E5%B9%B2%E5%9C%B0%E6%94%AF&ie=utf-8&src=se_lighten_f">天干地支</a>
- //系統當前時間
- private String sysDate = "";
- private String sys_year = "";
- private String sys_month = "";
- private String sys_day = "";
- public CalendarAdapter(){
- Date date = new Date();
- sysDate = sdf.format(date); //當期日期
- sys_year = sysDate.split("-")[0];
- sys_month = sysDate.split("-")[1];
- sys_day = sysDate.split("-")[2];
- }
- public CalendarAdapter(Context context,Resources rs,int jumpMonth,int jumpYear,int year_c,int month_c,int day_c){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- int stepYear = year_c+jumpYear;
- int stepMonth = month_c+jumpMonth ;
- if(stepMonth > 0){
- //往下一個月滑動
- if(stepMonth%12 == 0){
- stepYear = year_c + stepMonth/12 -1;
- stepMonth = 12;
- }else{
- stepYear = year_c + stepMonth/12;
- stepMonth = stepMonth%12;
- }
- }else{
- //往上一個月滑動
- stepYear = year_c - 1 + stepMonth/12;
- stepMonth = stepMonth%12 + 12;
- if(stepMonth%12 == 0){
- }
- }
- currentYear = String.valueOf(stepYear);; //得到當前的年份
- currentMonth = String.valueOf(stepMonth); //得到本月 (jumpMonth為滑動的次數,每滑動一次就增加一月或減一月)
- currentDay = String.valueOf(day_c); //得到當前日期是哪天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- public CalendarAdapter(Context context,Resources rs,int year, int month, int day){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- currentYear = String.valueOf(year);; //得到跳轉到的年份
- currentMonth = String.valueOf(month); //得到跳轉到的月份
- currentDay = String.valueOf(day); //得到跳轉到的天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return dayNumber.length;
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if(convertView == null){
- convertView = LayoutInflater.from(context).inflate(R.layout.calendar_item, null);
- }
- TextView textView = (TextView) convertView.findViewById(R.id.tvtext);
- String d = dayNumber[position].split("\\.")[0];
- String dv = dayNumber[position].split("\\.")[1];
- SpannableString sp = new SpannableString(d+"\n"+dv);
- sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- sp.setSpan(new RelativeSizeSpan(1.2f) , 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- if(dv != null ||dv != ""){
- sp.setSpan(new RelativeSizeSpan(0.75f), d.length()+1, dayNumber[position].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- // sp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 14, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
- textView.setText(sp);
- textView.setTextColor(Color.GRAY);
- // if(position<7){
- // //設定周
- // textView.setTextColor(Color.WHITE);
- // textView.setBackgroundColor(color.search_txt_color);
- // textView.setTextSize(14);
- // }
- if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) {
- // 當前月資訊顯示
- textView.setTextColor(Color.BLACK);// 當月字型設黑
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- }
- if(schDateTagFlag != null && schDateTagFlag.length >0){
- for(int i = 0; i < schDateTagFlag.length; i++){
- if(schDateTagFlag[i] == position){
- //設定日程標記背景
- textView.setBackgroundResource(R.drawable.mark);
- }
- }
- }
- if(currentFlag == position){
- //設定當天的背景
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- textView.setBackgroundDrawable(drawable);
- textView.setTextColor(Color.WHITE);
- }
- return convertView;
- }
- //得到某年的某月的天數且這月的第一天是星期幾
- public void getCalendar(int year, int month){
- isLeapyear = sc.isLeapYear(year); //是否為閏年
- daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的總天數
- dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天為星期幾
- lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month-1); //上一個月的總天數
- Log.d("DAY", isLeapyear+" ====== "+daysOfMonth+" ============ "+dayOfWeek+" ========= "+lastDaysOfMonth);
- getweek(year,month);
- }
- //將一個月中的每一天的值新增入陣列dayNuber中
- private void getweek(int year, int month) {
- int j = 1;
- int flag = 0;
- String lunarDay = "";
- //得到當前月的所有日程日期(這些日期需要標記)
- for (int i = 0; i < dayNumber.length; i++) {
- // 週一
- // if(i<7){
- // dayNumber[i]=week[i]+"."+" ";
- // }
- if(i < dayOfWeek){ //前一個月
- int temp = lastDaysOfMonth - dayOfWeek+1;
- lunarDay = lc.getLunarDate(year, month-1, temp+i,false);
- dayNumber[i] = (temp + i)+"."+lunarDay;
- }else if(i < daysOfMonth + dayOfWeek){ //本月
- String day = String.valueOf(i-dayOfWeek+1); //得到的日期
- lunarDay = lc.getLunarDate(year, month, i-dayOfWeek+1,false);
- dayNumber[i] = i-dayOfWeek+1+"."+lunarDay;
- //對於當前月才去標記當前日期
- if(sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)){
- //標記當前日期
- currentFlag = i;
- }
- setShowYear(String.valueOf(year));
- setShowMonth(String.valueOf(month));
- setAnimalsYear(lc.animalsYear(year));
- setLeapMonth(lc.leapMonth == 0?"":String.valueOf(lc.leapMonth));
- setCyclical(lc.cyclical(year));
- }else{ //下一個月
- lunarDay = lc.getLunarDate(year, month+1, j,false);
- dayNumber[i] = j+"."+lunarDay;
- j++;
- }
- }
- String abc = "";
- for(int i = 0; i < dayNumber.length; i++){
- abc = abc+dayNumber[i]+":";
- }
- Log.d("DAYNUMBER",abc);
- }
- public void matchScheduleDate(int year, int month, int day){
- }
- /**
- * 點選每一個item時返回item中的日期
- * @param position
- * @return
- */
- public String getDateByClickItem(int position){
- return dayNumber[position];
- }
- /**
- * 在點選gridView時,得到這個月中第一天的位置
- * @return
- */
- public int getStartPositon(){
- return dayOfWeek+7;
- }
- /**
- * 在點選gridView時,得到這個月中最後一天的位置
- * @return
- */
- public int getEndPosition(){
- return (dayOfWeek+daysOfMonth+7)-1;
- }
- public String getShowYear() {
- return showYear;
- }
- public void setShowYear(String showYear) {
- this.showYear = showYear;
- }
- public String getShowMonth() {
- return showMonth;
- }
- public void setShowMonth(String showMonth) {
- this.showMonth = showMonth;
- }
- public String getAnimalsYear() {
- return animalsYear;
- }
- public void setAnimalsYear(String animalsYear) {
- this.animalsYear = animalsYear;
- }
- public String getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(String leapMonth) {
- this.leapMonth = leapMonth;
- }
- public String getCyclical() {
- return cyclical;
- }
- public void setCyclical(String cyclical) {
- this.cyclical = cyclical;
- }
- }
計算類
- import java.util.Calendar;
- public class SpecialCalendar {
- private int daysOfMonth = 0; //某月的天數
- private int dayOfWeek = 0; //具體某一天是星期幾
- // 判斷是否為閏年
- public boolean isLeapYear(int year) {
- if (year % 100 == 0 && year % 400 == 0) {
- return true;
- } else if (year % 100 != 0 && year % 4 == 0) {
- return true;
- }
- return false;
- }
- //得到某月有多少天數
- public int getDaysOfMonth(boolean isLeapyear, int month) {
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- daysOfMonth = 31;
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- daysOfMonth = 30;
- break;
- case 2:
- if (isLeapyear) {
- daysOfMonth = 29;
- } else {
- daysOfMonth = 28;
- }
- }
- return daysOfMonth;
- }
- //指定某年中的某月的第一天是星期幾
- public int getWeekdayOfMonth(int year, int month){
- Calendar cal = Calendar.getInstance();
- cal.set(year, month-1, 1);
- dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;
- return dayOfWeek;
- }
- }
節日和陰曆計算類
關於日曆實現程式碼裡0x04bd8, 0x04ae0, 0x0a570的解釋:
http://blog.csdn.net/onlyonecoder/article/details/8484118
- public class LunarCalendar {
- private int year; //農曆的年份
- private int month;
- private int day;
- private String lunarMonth; //農曆的月份
- private boolean leap;
- public int leapMonth = 0; //閏的是哪個月
- final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七",
- "八", "九", "十", "十一", "十二" };
- static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
- "yyyy年MM月dd日");
- final static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570,
- 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
- 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
- 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
- 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
- 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0,
- 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4,
- 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550,
- 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
- 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
- 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
- 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
- 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40,
- 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3,
- 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960,
- 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0,
- 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
- 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0,
- 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65,
- 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0,
- 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
- 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
- //農曆部分假日
- final static String[] lunarHoliday = new String[]{
- "0101 春節",
- "0115 元宵",
- "0505 端午",
- "0707 七夕情人",
- "0715 中元",
- "0815 中秋",
- "0909 重陽",
- "1208 臘八",
- "1224 小年",
- "0100 除夕"
- };
- //公曆部分節假日
- final static String[] solarHoliday = new String[]{
- "0101 元旦",
- "0214 情人",
- "0308 婦女",
- "0312 植樹",
- "0315 消費者權益日",
- "0401 愚人",
- "0501 勞動",
- "0504 青年",
- "0512 護士",
- "0601 兒童",
- "0701 建黨",
- "0801 建軍",
- "0808 父親",
- "0909 毛澤東逝世紀念",
- "0910 教師",
- "0928 孔子誕辰",
- "1001 國慶",
- "1006 老人",
- "1024 聯合國日",
- "1112 孫中山誕辰紀念",
- "1220 澳門迴歸紀念",
- "1225 聖誕",
- "1226 毛澤東誕辰紀念"
- };
- // ====== 傳回農曆 y年的總天數
- final private static int yearDays(int y) {
- int i, sum = 348;
- for (i = 0x8000; i > 0x8; i >>= 1) {
- if ((lunarInfo[y - 1900] & i) != 0)
- sum += 1;
- }
- return (sum + leapDays(y));
- }
- // ====== 傳回農曆 y年閏月的天數
- final private static int leapDays(int y) {
- if (leapMonth(y) != 0) {
- if ((lunarInfo[y - 1900] & 0x10000) != 0)
- return 30;
- else
- return 29;
- } else
- return 0;
- }
- // ====== 傳回農曆 y年閏哪個月 1-12 , 沒閏傳回 0
- final private static int leapMonth(int y) {
- return (int) (lunarInfo[y - 1900] & 0xf);
- }
- // ====== 傳回農曆 y年m月的總天數
- final private static int monthDays(int y, int m) {
- if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
- return 29;
- else
- return 30;
- }
- // ====== 傳回農曆 y年的生肖
- final public String animalsYear(int year) {
- final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龍", "蛇",
- "馬", "羊", "猴", "雞", "狗", "豬" };
- return Animals[(year - 4) % 12];
- }
- // ====== 傳入 月日的offset 傳回干支, 0=甲子
- final private static String cyclicalm(int num) {
- final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",
- "辛", "壬", "癸" };
- final String[] Zhi = new String[] { "子", "醜", "寅", "卯", "辰", "巳", "午",
- "未", "申", "酉", "戌", "亥" };
- return (Gan[num % 10] + Zhi[num % 12]);
- }
- // ====== 傳入 offset 傳回干支, 0=甲子
- final public String cyclical(int year) {
- int num = year - 1900 + 36;
- return (cyclicalm(num));
- }
- public static String getChinaDayString(int day) {
- String chineseTen[] = { "初", "十", "廿", "卅" };
- int n = day % 10 == 0 ? 9 : day % 10 - 1;
- if (day > 30)
- return "";
- if (day == 10)
- return "初十";
- else
- return chineseTen[day / 10] + chineseNumber[n];
- }
- /** */
- /**
- * 傳出y年m月d日對應的農曆. yearCyl3:農曆年與1864的相差數 ? monCyl4:從1900年1月31日以來,閏月數
- * dayCyl5:與1900年1月31日相差的天數,再加40 ?
- *
- * isday: 這個引數為false---日期為節假日時,陰曆日期就返回節假日 ,true---不管日期是否為節假日依然返回這天對應的陰曆日期
- * @param cal
- * @return
- */
- public String getLunarDate(int year_log, int month_log, int day_log, boolean isday) {
- // @SuppressWarnings("unused")
- int yearCyl, monCyl, dayCyl;
- //int leapMonth = 0;
- String nowadays;
- Date baseDate = null;
- Date nowaday = null;
- try {
- baseDate = chineseDateFormat.parse("1900年1月31日");
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- nowadays = year_log + "年" + month_log + "月" + day_log + "日";
- try {
- nowaday = chineseDateFormat.parse(nowadays);
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- // 求出和1900年1月31日相差的天數
- int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
- dayCyl = offset + 40;
- monCyl = 14;
- // 用offset減去每農曆年的天數
- // 計算當天是農曆第幾天
- // i最終結果是農曆的年份
- // offset是當年的第幾天
- int iYear, daysOfYear = 0;
- for (iYear = 1900; iYear < 10000 && offset > 0; iYear++) {
- daysOfYear = yearDays(iYear);
- offset -= daysOfYear;
- monCyl += 12;
- }
- if (offset < 0) {
- offset += daysOfYear;
- iYear--;
- monCyl -= 12;
- }
- // 農曆年份
- year = iYear;
- setYear(year); //設定公曆對應的農曆年份
- yearCyl = iYear - 1864;
- leapMonth = leapMonth(iYear); // 閏哪個月,1-12
- leap = false;
- // 用當年的天數offset,逐個減去每月(農曆)的天數,求出當天是本月的第幾天
- int iMonth, daysOfMonth = 0;
- for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
- // 閏月
- if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
- --iMonth;
- leap = true;
- daysOfMonth = leapDays(year);
- } else
- daysOfMonth = monthDays(year, iMonth);
- offset -= daysOfMonth;
- // 解除閏月
- if (leap && iMonth == (leapMonth + 1))
- leap = false;
- if (!leap)
- monCyl++;
- }
- // offset為0時,並且剛才計算的月份是閏月,要校正
- if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
- if (leap) {
- leap = false;
- } else {
- leap = true;
- --iMonth;
- --monCyl;
- }
- }
- // offset小於0時,也要校正
- if (offset < 0) {
- offset += daysOfMonth;
- --iMonth;
- --monCyl;
- }
- month = iMonth;
- setLunarMonth(chineseNumber[month - 1] + "月"); //設定對應的陰曆月份
- day = offset + 1;
- if(!isday){
- //如果日期為節假日則陰曆日期則返回節假日
- //setLeapMonth(leapMonth);
- for(int i = 0; i < solarHoliday.length; i++){
- //返回公曆節假日名稱
- String sd = solarHoliday[i].split(" ")[0]; //節假日的日期
- String sdv = solarHoliday[i].split(" ")[1]; //節假日的名稱
- String smonth_v = month_log+"";
- String sday_v = day_log+"";
- String smd = "";
- if(month_log < 10){
- smonth_v = "0"+month_log;
- }
- if(day_log < 10){
- sday_v = "0"+day_log;
- }
- smd = smonth_v+sday_v;
- if(sd.trim().equals(smd.trim())){
- return sdv;
- }
- }
- for(int i = 0; i < lunarHoliday.length; i++){
- //返回農曆節假日名稱
- String ld =lunarHoliday[i].split(" ")[0]; //節假日的日期
- String ldv = lunarHoliday[i].split(" ")[1]; //節假日的名稱
- String lmonth_v = month+"";
- String lday_v = day+"";
- String lmd = "";
- if(month < 10){
- lmonth_v = "0"+month;
- }
- if(day < 10){
- lday_v = "0"+day;
- }
- lmd = lmonth_v+lday_v;
- if(ld.trim().equals(lmd.trim())){
- return ldv;
- }
- }
- }
- if (day == 1)
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- }
- public String toString() {
- if (chineseNumber[month - 1] == "一" && getChinaDayString(day) == "初一")
- return "農曆" + year + "年";
- else if (getChinaDayString(day) == "初一")
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- // return year + "年" + (leap ? "閏" : "") + chineseNumber[month - 1] +
- // "月" + getChinaDayString(day);
- }
- /*public static void main(String[] args) {
- System.out.println(new LunarCalendar().getLunarDate(2012, 1, 23));
- }*/
- public int getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(int leapMonth) {
- this.leapMonth = leapMonth;
- }
- /**
- * 得到當前日期對應的陰曆月份
- * @return
- */
- public String getLunarMonth() {
- return lunarMonth;
- }
- public void setLunarMonth(String lunarMonth) {
- this.lunarMonth = lunarMonth;
- }
- /**
- * 得到當前年對應的農曆年份
- * @return
- */
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- }
Activity
- /**
- * 日曆顯示activity
- *
- *
- */
- public class CalendarActivity extends Activity implements OnGestureListener {
- private GestureDetector gestureDetector = null;
- private CalendarAdapter calV = null;
- private GridView gridView = null;
- private TextView topText = null;
- private static int jumpMonth = 0; //每次滑動,增加或減去一個月,預設為0(即顯示當前月)
- private static int jumpYear = 0; //滑動跨越一年,則增加或者減去一年,預設為0(即當前年)
- private int year_c = 0;
- private int month_c = 0;
- private int day_c = 0;
- private String currentDate = "";
- private Bundle bd=null;//傳送引數
- private Bundle bun=null;//接收引數
- private String ruzhuTime;
- private String lidianTime;
- private String state="";
- public CalendarActivity() {
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- currentDate = sdf.format(date); //當期日期
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityList.activityList.add(this);
- setContentView(R.layout.calendar);
- bd=new Bundle();//out
- bun=getIntent().getExtras();//in
- if(bun!=null&&bun.getString("state").equals("ruzhu"))
- {
- state=bun.getString("state");
- System.out.println("%%%%%%"+state);
- }else if(bun!=null&&bun.getString("state").equals("lidian")){
- state=bun.getString("state");
- System.out.println("|||||||||||"+state);
- }
- gestureDetector = new GestureDetector(this);
- // bd=new Bundle();
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- addGridView();
- gridView.setAdapter(calV);
- topText = (TextView) findViewById(R.id.tv_month);
- addTextToTopTextView(topText);
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int gvFlag = 0; //每次新增gridview到viewflipper中時給的標記
- if (e1.getX() - e2.getX() > 120) {
- //像左滑動
- addGridView(); //新增一個gridView
- jumpMonth++; //下一個月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- return true;
- } else if (e1.getX() - e2.getX() < -120) {
- //向右滑動
- addGridView(); //新增一個gridView
- jumpMonth--; //上一個月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- gvFlag++;
- addTextToTopTextView(topText);
- return true;
- }
- return false;
- }
- /**
- * 建立選單
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(0, menu.FIRST, menu.FIRST, "今天");
- return super.onCreateOptionsMenu(menu);
- }
- /**
- * 選擇選單
- */
- @Override
- public boolean onMenuItemSelected(int featureId, MenuItem item) {
- switch (item.getItemId()){
- case Menu.FIRST:
- //跳轉到今天
- int xMonth = jumpMonth;
- int xYear = jumpYear;
- int gvFlag =0;
- jumpMonth = 0;
- jumpYear = 0;
- addGridView(); //新增一個gridView
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- break;
- }
- return super.onMenuItemSelected(featureId, item);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return this.gestureDetector.onTouchEvent(event);
- }
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- //新增頭部的年份 閏哪月等資訊
- public void addTextToTopTextView(TextView view){
- StringBuffer textDate = new StringBuffer();
- textDate.append(calV.getShowYear()).append("年").append(
- calV.getShowMonth()).append("月").append("\t");
- view.setText(textDate);
- view.setTextColor(Color.WHITE);
- view.setTypeface(Typeface.DEFAULT_BOLD);
- }
- //新增gridview
- private void addGridView() {
- gridView =(GridView)findViewById(R.id.gridview);
- gridView.setOnTouchListener(new OnTouchListener() {
- //將gridview中的觸控事件回傳給gestureDetector
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- return CalendarActivity.this.gestureDetector.onTouchEvent(event);
- }
- });
- gridView.setOnItemClickListener(new OnItemClickListener() {
- //gridView中的每一個item的點選事件
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- //點選任何一個item,得到這個item的日期(排除點選的是週日到週六(點選不響應))
- int startPosition = calV.getStartPositon();
- int endPosition = calV.getEndPosition();
- if(startPosition <= position+7 && position <= endPosition-7){
- String scheduleDay = calV.getDateByClickItem(position).split("\\.")[0]; //這一天的陽曆
- //String scheduleLunarDay = calV.getDateByClickItem(position).split("\\.")[1]; //這一天的陰曆
- String scheduleYear = calV.getShowYear();
- String scheduleMonth = calV.getShowMonth();
- // Toast.makeText(CalendarActivity.this, scheduleYear+"-"+scheduleMonth+"-"+scheduleDay, 2000).show();
- ruzhuTime=scheduleMonth+"月"+scheduleDay+"日";
- lidianTime=scheduleMonth+"月"+scheduleDay+"日";
- Intent intent=new Intent();
- if(state.equals("ruzhu"))
- {
- bd.putString("ruzhu", ruzhuTime);
- System.out.println("ruzhuuuuuu"+bd.getString("ruzhu"));
- }else if(state.equals("lidian")){
- bd.putString("lidian", lidianTime);
- }
- intent.setClass(CalendarActivity.this, HotelActivity.class);
- intent.putExtras(bd);
- startActivity(intent);
- finish();
- }
- }
- });
- }
- }
相關文章
- PHP實現的簡單日曆程式碼PHP
- Android自定義日曆控制元件的實現過程詳解Android控制元件
- Flutter的staggered GridView詳細使用FlutterView
- 微信小程式實現簽到的日曆微信小程式
- Android RecyclerView-使用Itemdecoration實現粘性頭部功能,詳細到具體步驟.AndroidView
- 使用RecycleView實現無限滾動的日曆View
- 關於日曆程式原始碼原始碼
- 用java實現日曆demo。Java
- 日曆形式實現解析薦
- 實現陽曆和農曆顯示日期的javascript程式碼JavaScript
- asp.net 實現購物車詳細程式碼ASP.NET
- JavaScript日曆效果程式碼例項JavaScript
- vue之實現日曆----顯示農曆,滾動日曆監聽年月改變Vue
- Android之ViewPager+GridView實現GridView介面滑動AndroidViewpager
- Yii使用DbTarget實現日誌功能
- 微信小程式開發05-日曆元件的實現微信小程式元件
- 10行程式碼實現微信小程式支付功能,使用小程式雲開發實現小程式支付功能(行程微信小程式
- 使用ObjectDataSource實現GridView分頁ObjectView
- 原生JavaScript實現造日曆輪子JavaScript
- 物件~時間篇_日曆的實現物件
- mysql語法使用詳細程式碼版MySql
- 教你C語言實現通訊錄的詳細程式碼C語言
- JavaScript 實現sprintf 功能程式碼JavaScript
- Android日曆提醒軟體Android
- 如何在Mac中使用佛教日曆,波斯日曆等Mac
- js簡單日曆效果程式碼例項JS
- Android使用程式碼實現關機/重啟Android
- 自定義view之實現日曆介面(一)View
- 自定義view之實現日曆介面(二)View
- java實現一個月的日曆列印Java
- JavaScript 實現日曆式日期選擇 (轉)JavaScript
- ffmpeg播放器開發 詳細記錄+程式碼實現3播放器
- SSM 實現支付寶支付功能(圖文詳解+完整程式碼)SSM
- JavaScript簡單的日曆效果程式碼例項JavaScript
- 【小程式】使用UDP實現群聊功能UDP
- 小程式-日曆簽到
- 實現table細線表格效果程式碼
- 移動端日曆元件設計與實現元件