Android使用GridView實現(xiàn)日歷功能示例(詳細(xì)代碼)
Android使用GridView實現(xiàn)日歷功能示例,代碼有點多,發(fā)個圖先:
如果懶得往下看的,可以直接下載源碼吧,最近一直有人要,由于時間太久了,懶得找出來整理,今天又看到有人要,正好沒事就整理了一下
布局文件:
<?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>
Item:
<?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>
Adapter:
/** * 日歷gridview中的每一個item顯示的textview * @author lmw * */ public class CalendarAdapter extends BaseAdapter { private boolean isLeapyear = false; //是否為閏年 private int daysOfMonth = 0; //某月的天數(shù) private int dayOfWeek = 0; //具體某一天是星期幾 private int lastDaysOfMonth = 0; //上一個月的總天數(shù) private Context context; private String[] dayNumber = new String[42]; //一個gridview中的日期存入此數(shù)組中 // 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; //用于標(biāo)記當(dāng)天 private int[] schDateTagFlag = null; //存儲當(dāng)月所有的日程日期 private String showYear = ""; //用于在頭部顯示的年份 private String showMonth = ""; //用于在頭部顯示的月份 private String animalsYear = ""; private String leapMonth = ""; //閏哪一個月 private String cyclical = ""; //天干地支 //系統(tǒng)當(dāng)前時間 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); //當(dāng)期日期 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);; //得到當(dāng)前的年份 currentMonth = String.valueOf(stepMonth); //得到本月 (jumpMonth為滑動的次數(shù),每滑動一次就增加一月或減一月) currentDay = String.valueOf(day_c); //得到當(dāng)前日期是哪天 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);; //得到跳轉(zhuǎn)到的年份 currentMonth = String.valueOf(month); //得到跳轉(zhuǎn)到的月份 currentDay = String.valueOf(day); //得到跳轉(zhuǎn)到的天 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){ // //設(shè)置周 // textView.setTextColor(Color.WHITE); // textView.setBackgroundColor(color.search_txt_color); // textView.setTextSize(14); // } if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) { // 當(dāng)前月信息顯示 textView.setTextColor(Color.BLACK);// 當(dāng)月字體設(shè)黑 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){ //設(shè)置日程標(biāo)記背景 textView.setBackgroundResource(R.drawable.mark); } } } if(currentFlag == position){ //設(shè)置當(dāng)天的背景 drawable = res.getDrawable(R.drawable.current_day_bgc); textView.setBackgroundDrawable(drawable); textView.setTextColor(Color.WHITE); } return convertView; } //得到某年的某月的天數(shù)且這月的第一天是星期幾 public void getCalendar(int year, int month){ isLeapyear = sc.isLeapYear(year); //是否為閏年 daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的總天數(shù) dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天為星期幾 lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month-1); //上一個月的總天數(shù) Log.d("DAY", isLeapyear+" ====== "+daysOfMonth+" ============ "+dayOfWeek+" ========= "+lastDaysOfMonth); getweek(year,month); } //將一個月中的每一天的值添加入數(shù)組dayNuber中 private void getweek(int year, int month) { int j = 1; int flag = 0; String lunarDay = ""; //得到當(dāng)前月的所有日程日期(這些日期需要標(biāo)記) 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; //對于當(dāng)前月才去標(biāo)記當(dāng)前日期 if(sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)){ //標(biāo)記當(dāng)前日期 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; //某月的天數(shù) 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; } //得到某月有多少天數(shù) 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; } }
節(jié)日和陰歷計算類
關(guān)于日歷實現(xiàn)代碼里0x04bd8, 0x04ae0, 0x0a570的解釋:
new Array( 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,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0, 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0, 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,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, 0x14b63);
正確的解釋是:
二進制形式
xxxx xxxx xxxx xxxx xxxx
20-17 16-12 12-9 8-5 4-1
1-4: 表示當(dāng)年有無閏年,有的話,為閏月的月份,沒有的話,為0。
5-16:為除了閏月外的正常月份是大月還是小月,1為30天,0為29天。
注意:從1月到12月對應(yīng)的是第16位到第5位。
17-20: 表示閏月是大月還是小月,僅當(dāng)存在閏月的情況下有意義。
舉個例子:
1980年的數(shù)據(jù)是: 0x095b0
二進制:0000 1001 0101 1011 0000
表示1980年沒有閏月,從1月到12月的天數(shù)依次為:30、29、29、30 、29、30、29、30、 30、29、30、30。
1982年的數(shù)據(jù)是:0x0a974
0000 1010 0 1001 0111 0100
表示1982年的4月為閏月,即有第二個4月,且是閏小月。
從1月到13月的天數(shù)依次為:30、29、30、29、 29(閏月)、 30、29、29、30、 29、30、30、30。
public class LunarCalendar { private int year; //農(nóng)歷的年份 private int month; private int day; private String lunarMonth; //農(nóng)歷的月份 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 }; //農(nóng)歷部分假日 final static String[] lunarHoliday = new String[]{ "0101 春節(jié)", "0115 元宵", "0505 端午", "0707 七夕情人", "0715 中元", "0815 中秋", "0909 重陽", "1208 臘八", "1224 小年", "0100 除夕" }; //公歷部分節(jié)假日 final static String[] solarHoliday = new String[]{ "0101 元旦", "0214 情人", "0308 婦女", "0312 植樹", "0315 消費者權(quán)益日", "0401 愚人", "0501 勞動", "0504 青年", "0512 護士", "0601 兒童", "0701 建黨", "0801 建軍", "0808 父親", "0910 教師", "1001 國慶", "1024 聯(lián)合國日", "1225 圣誕" }; // ====== 傳回農(nóng)歷 y年的總天數(shù) 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)); } // ====== 傳回農(nóng)歷 y年閏月的天數(shù) 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; } // ====== 傳回農(nóng)歷 y年閏哪個月 1-12 , 沒閏傳回 0 final private static int leapMonth(int y) { return (int) (lunarInfo[y - 1900] & 0xf); } // ====== 傳回農(nóng)歷 y年m月的總天數(shù) final private static int monthDays(int y, int m) { if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0) return 29; else return 30; } // ====== 傳回農(nóng)歷 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日對應(yīng)的農(nóng)歷. yearCyl3:農(nóng)歷年與1864的相差數(shù) ? monCyl4:從1900年1月31日以來,閏月數(shù) * dayCyl5:與1900年1月31日相差的天數(shù),再加40 ? * * isday: 這個參數(shù)為false---日期為節(jié)假日時,陰歷日期就返回節(jié)假日 ,true---不管日期是否為節(jié)假日依然返回這天對應(yīng)的陰歷日期 * @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日相差的天數(shù) int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L); dayCyl = offset + 40; monCyl = 14; // 用offset減去每農(nóng)歷年的天數(shù) // 計算當(dāng)天是農(nóng)歷第幾天 // i最終結(jié)果是農(nóng)歷的年份 // offset是當(dāng)年的第幾天 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; } // 農(nóng)歷年份 year = iYear; setYear(year); //設(shè)置公歷對應(yīng)的農(nóng)歷年份 yearCyl = iYear - 1864; leapMonth = leapMonth(iYear); // 閏哪個月,1-12 leap = false; // 用當(dāng)年的天數(shù)offset,逐個減去每月(農(nóng)歷)的天數(shù),求出當(dāng)天是本月的第幾天 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] + "月"); //設(shè)置對應(yīng)的陰歷月份 day = offset + 1; if(!isday){ //如果日期為節(jié)假日則陰歷日期則返回節(jié)假日 //setLeapMonth(leapMonth); for(int i = 0; i < solarHoliday.length; i++){ //返回公歷節(jié)假日名稱 String sd = solarHoliday[i].split(" ")[0]; //節(jié)假日的日期 String sdv = solarHoliday[i].split(" ")[1]; //節(jié)假日的名稱 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++){ //返回農(nóng)歷節(jié)假日名稱 String ld =lunarHoliday[i].split(" ")[0]; //節(jié)假日的日期 String ldv = lunarHoliday[i].split(" ")[1]; //節(jié)假日的名稱 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 "農(nóng)歷" + 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; } /** * 得到當(dāng)前日期對應(yīng)的陰歷月份 * @return */ public String getLunarMonth() { return lunarMonth; } public void setLunarMonth(String lunarMonth) { this.lunarMonth = lunarMonth; } /** * 得到當(dāng)前年對應(yīng)的農(nóng)歷年份 * @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; //每次滑動,增加或減去一個月,默認(rèn)為0(即顯示當(dāng)前月) private static int jumpYear = 0; //滑動跨越一年,則增加或者減去一年,默認(rèn)為0(即當(dāng)前年) private int year_c = 0; private int month_c = 0; private int day_c = 0; private String currentDate = ""; private Bundle bd=null;//發(fā)送參數(shù) private Bundle bun=null;//接收參數(shù) 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); //當(dāng)期日期 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中時給的標(biāo)記 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; } /** * 創(chuàng)建菜單 */ @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: //跳轉(zhuǎn)到今天 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的日期(排除點擊的是周日到周六(點擊不響應(yīng))) 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(); } } }); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 進階實現(xiàn)性能優(yōu)化之OOM與Leakcanary詳解原理
LeakCanary 是大名鼎鼎的 square 公司開源的內(nèi)存泄漏檢測工具。目前上大部分App在開發(fā)測試階段都會接入此工具用于檢測潛在的內(nèi)存泄漏問題,做的好一點的可能會搭建一個服務(wù)器用于保存各個設(shè)備上的內(nèi)存泄漏問題再集中處理2021-11-11Input系統(tǒng)分發(fā)策略及其應(yīng)用示例詳解
這篇文章主要為大家介紹了Input系統(tǒng)分發(fā)策略及其應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流
這篇文章主要為大家介紹了FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10android使用TextView實現(xiàn)跑馬燈效果
這篇文章主要為大家詳細(xì)介紹了android使用TextView實現(xiàn)跑馬燈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05ScrollView與ListView合用(正確計算Listview的高度)的問題解決
最近做項目中用到ScrollView和ListView一起使用的問題,顯示的時候ListView不能完全正確的顯示,查了好多資料終于成功解決:2013-05-05Android 使用registerReceiver注冊BroadcastReceiver案例詳解
這篇文章主要介紹了Android 使用registerReceiver注冊BroadcastReceiver案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08