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無需權(quán)限調(diào)起系統(tǒng)相機
在進行一些小型APP的開發(fā),或者是對拍照界面沒有自定義要求時,我們可以用調(diào)起系統(tǒng)相機的方式快速完成拍照需求2023-03-03
如何玩轉(zhuǎn)Android矢量圖VectorDrawable
這篇文章主要教大家如何玩轉(zhuǎn)Android矢量圖VectorDrawable,對矢量圖感興趣的小伙伴們可以參考一下2016-05-05
基于Android中dp和px之間進行轉(zhuǎn)換的實現(xiàn)代碼
本篇文章是對在Android中dp和px之間進行轉(zhuǎn)換的實現(xiàn)方法進行了分析介紹,需要的朋友參考下2013-05-05
Android控件系列之Button以及Android監(jiān)聽器使用介紹
Button是各種UI中最常用的控件之一,它同樣也是Android開發(fā)中最受歡迎的控件之一,用戶可以通過觸摸它來觸發(fā)一系列事件,要知道一個沒有點擊事件的Button是沒有任何意義的,因為使用者的固定思維是見到它就想去點2012-11-11
Android 基于RecyclerView實現(xiàn)的歌詞滾動自定義控件
這篇文章主要介紹了Android 基于RecyclerView實現(xiàn)的歌詞滾動自定義控件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Navigation?Bundle實現(xiàn)兩個Fragment參數(shù)傳遞
這篇文章主要為大家介紹了Navigation?Bundle實現(xiàn)兩個Fragment參數(shù)傳遞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

