本文实例为大家分享了AndroID实现淘宝预订日历的具体代码,供大家参考,具体内容如下
MainActivity.java代码:
package siso.calendarselector;import androID.app.Activity;import androID.content.Intent;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.Widget.EditText;import siso.calendarselector.lib.CalendarSelectorActivity;public class MainActivity extends Activity { private EditText orderEt; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); } public voID jump(VIEw v) { EditText et = (EditText) findVIEwByID(R.ID.et_input); orderEt = (EditText) findVIEwByID(R.ID.et_order); int days = Integer.valueOf(et.getText().toString()); String order = orderEt.getText().toString(); Intent i = new Intent(MainActivity.this,CalendarSelectorActivity.class); i.putExtra(CalendarSelectorActivity.DAYS_OF_SELECT,days); i.putExtra(CalendarSelectorActivity.ORDER_DAY,order); startActivityForResult(i,1); } @OverrIDe protected voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if (requestCode == 1 && resultCode == RESulT_OK) { String orderInfo = data.getStringExtra(CalendarSelectorActivity.ORDER_DAY); orderEt.setText(orderInfo); /* *****注意***** // 如需转换为Calendar // 正确转换方法(因为2月没有30天): String[] info = orderInfo.split("#"); Calendar c = Calendar.getInstance(); c.set(Integer.valueOf(info[0]),Integer.valueOf(info[1]) - 1,Integer.valueOf(info[2])); // 错误转换方法: c.set(Integer.valueOf(info[0]),Integer.valueOf(info[1]),Integer.valueOf(info[2])); c.add(Calendar.MONTH,-1); **/ } }}
Calendaradapter.java代码:
package siso.calendarselector.lib;import java.util.ArrayList;import java.util.Calendar;import androID.content.Context;import androID.graphics.color;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.BaseAdapter;import androID.Widget.TextVIEw;import siso.calendarselector.R;/** * @Description 日历表格适配器 */public class Calendaradapter extends BaseAdapter { private ArrayList<Day> days; private LayoutInflater mInflater; private Calendar c; private Context context; private String orderDay; public Calendaradapter(Context context,Calendar c,int passDays,String orderDay) { this.c = c; this.context = context; this.orderDay = orderDay; days = CalendarUtils.getDaysOfMonth(this.c,passDays,orderDay); mInflater = LayoutInflater.from(context); } @OverrIDe public int getCount() { return days.size(); } @OverrIDe public Day getItem(int arg0) { return days.get(arg0); } @OverrIDe public long getItemID(int arg0) { return 0; } @OverrIDe public VIEw getVIEw(int arg0,VIEw arg1,VIEwGroup arg2) { VIEw v = arg1; VIEwHolder holder = null; if (v == null) { v = mInflater.inflate(R.layout.calendar_item,arg2,false); holder = new VIEwHolder(); holder.tv = (TextVIEw) v.findVIEwByID(R.ID.tv_calendar_item); v.setTag(holder); } else { holder = (VIEwHolder) v.getTag(); } Day d = getItem(arg0); switch (d.getType()) { case TODAY: setorderThreeDayStyle(holder.tv,d.isOrdered(),context.getString(R.string.today)); break; case TOMORROW: setorderThreeDayStyle(holder.tv,context.getString(R.string.tomorrow)); break; case T_D_A_T: setorderThreeDayStyle(holder.tv,context.getString(R.string.t_d_a_t)); break; case ENABLE: holder.tv.setText(d.isOrdered() ? d.getname() + context.getString(R.string.order_day) : d.getname()); holder.tv.setEnabled(true); holder.tv.setTextcolor(d.isOrdered() ? color.WHITE : context.getResources().getcolor( R.color.calendar_enable_color)); holder.tv.setBackgroundResource(d.isOrdered() ? R.drawable.calendar_order_item_bg : R.drawable.normal_calendar_order_item_bg); holder.tv.setTextSize(d.isOrdered() ? context.getResources().getDimension( R.dimen.calendar_item_order_day_size) : context.getResources().getDimension( R.dimen.calendar_item_nonorder_day_size)); break; case NOT_ENABLE: holder.tv.setText(d.getname()); holder.tv.setEnabled(false); holder.tv.setTextcolor(context.getResources().getcolor(R.color.calendar_disable_color)); holder.tv.setBackgroundcolor(color.WHITE); holder.tv.setTextSize(context.getResources().getDimension(R.dimen.calendar_item_nonorder_day_size)); break; } return v; } private voID setorderThreeDayStyle(TextVIEw tv,boolean ordered,String dayStr) { tv.setText(ordered ? dayStr + context.getString(R.string.order_day) : dayStr); tv.setEnabled(true); tv.setTextcolor(ordered ? color.WHITE : context.getResources().getcolor(R.color.calendar_threeday_color)); tv.setBackgroundResource(ordered ? R.drawable.calendar_order_item_bg : R.drawable.normal_calendar_order_item_bg); tv.setTextSize(ordered ? context.getResources().getDimension(R.dimen.calendar_item_order_day_size) : context .getResources().getDimension(R.dimen.calendar_item_nonorder_day_size)); } static class VIEwHolder { TextVIEw tv; } public voID prevIoUs() { if (c.get(Calendar.MONTH) == c.getActualMinimum(Calendar.MONTH)) { c.set((c.get(Calendar.YEAR) - 1),c.getActualMaximum(Calendar.MONTH),1); } else { c.set(Calendar.MONTH,c.get(Calendar.MONTH) - 1); } days = CalendarUtils.getDaysOfMonth(c,orderDay); notifyDataSetChanged(); } public voID next() { if (c.get(Calendar.MONTH) == c.getActualMaximum(Calendar.MONTH)) { c.set((c.get(Calendar.YEAR) + 1),c.getActualMinimum(Calendar.MONTH),c.get(Calendar.MONTH) + 1); } days = CalendarUtils.getDaysOfMonth(c,orderDay); notifyDataSetChanged(); }}
Calendarlistadapter.java代码:
package siso.calendarselector.lib;import java.util.Calendar;import androID.content.Context;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.AdapterVIEw;import androID.Widget.AdapterVIEw.OnItemClickListener;import androID.Widget.BaseAdapter;import androID.Widget.TextVIEw;import siso.calendarselector.R;/** * @Description 日历列表适配器 */public class Calendarlistadapter extends BaseAdapter { private Context context; private LayoutInflater mInflater; private int daysOfSelect; private String orderDay; private OnCalendarOrderListener Listener; public Calendarlistadapter(Context context,int daysOfSelect,String orderDay) { this.context = context; this.daysOfSelect = daysOfSelect; this.orderDay = orderDay; mInflater = LayoutInflater.from(context); } @OverrIDe public int getCount() { return CalendarUtils.throughMonth(Calendar.getInstance(),daysOfSelect) + 1; } @OverrIDe public Object getItem(int arg0) { return null; } @OverrIDe public long getItemID(int arg0) { return 0; } @OverrIDe public VIEw getVIEw(int arg0,VIEwGroup arg2) { VIEw v = arg1; VIEwHolder holder = null; if (v == null) { v = mInflater.inflate(R.layout.calendar,false); holder = new VIEwHolder(); holder.yearandMonth = (TextVIEw) v.findVIEwByID(R.ID.tv_year_month); holder.calendarGrID = (NoScrollGrIDVIEw) v.findVIEwByID(R.ID.gv_calendar_layout); v.setTag(holder); } else { holder = (VIEwHolder) v.getTag(); } final Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH,arg0); holder.yearandMonth.setText(c.get(Calendar.YEAR) + context.getString(R.string.year) + (c.get(Calendar.MONTH) + 1) + context.getString(R.string.month)); Calendaradapter cAdapter = null; if (arg0 == 0) { cAdapter = new Calendaradapter(context,c,daysOfSelect,orderDay); } else { int d = daysOfSelect - CalendarUtils.currentMonthRemainDays() - CalendarUtils.getFlowMonthDays(arg0 - 1); cAdapter = new Calendaradapter(context,d,orderDay); } holder.calendarGrID.setAdapter(cAdapter); holder.calendarGrID.setonItemClickListener(new OnItemClickListener() { @OverrIDe public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) { Calendar cl = (Calendar) c.clone(); cl.set(Calendar.DAY_OF_MONTH,1); int day = position + 2 - cl.get(Calendar.DAY_OF_WEEK); TextVIEw dayTv = (TextVIEw) vIEw.findVIEwByID(R.ID.tv_calendar_item); if (day <= 0 || !dayTv.isEnabled()) return; String orderInfo = c.get(Calendar.YEAR) + "#" + (c.get(Calendar.MONTH) + 1) + "#" + day; cl.clear(); cl = null; if (Listener != null) Listener.onorder(orderInfo); } }); return v; } static class VIEwHolder { TextVIEw yearandMonth; NoScrollGrIDVIEw calendarGrID; } public voID setonCalendarOrderListener(OnCalendarOrderListener Listener) { this.Listener = Listener; } public interface OnCalendarOrderListener { voID onorder(String orderInfo); }}
CalendarSelectorActivity.java代码:
package siso.calendarselector.lib;import androID.app.Activity;import androID.content.Intent;import androID.os.Bundle;import androID.Widget.ListVIEw;import siso.calendarselector.R;/** * @Description 预订日选择 */public class CalendarSelectorActivity extends Activity { /** * 可选天数 */ public static final String DAYS_OF_SELECT = "days_of_select"; /** * 上次预订日 */ public static final String ORDER_DAY = "order_day"; private int daysOfSelect; private String orderDay; private ListVIEw ListVIEw; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.calendar_selector); daysOfSelect = getIntent().getIntExtra(DAYS_OF_SELECT,30); orderDay = getIntent().getStringExtra(ORDER_DAY); ListVIEw = (ListVIEw) findVIEwByID(R.ID.lv_calendar); Calendarlistadapter adapter = new Calendarlistadapter(this,orderDay); ListVIEw.setAdapter(adapter); adapter.setonCalendarOrderListener(new Calendarlistadapter.OnCalendarOrderListener() { @OverrIDe public voID onorder(String orderInfo) { Intent result = new Intent(); result.putExtra(ORDER_DAY,orderInfo); setResult(RESulT_OK,result); finish(); } }); }}
CalendarUtils.java代码:
package siso.calendarselector.lib;import java.util.ArrayList;import java.util.Calendar;public class CalendarUtils { private static int dayOfMonth,monthOfYear,curYear; static { dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); monthOfYear = Calendar.getInstance().get(Calendar.MONTH); curYear = Calendar.getInstance().get(Calendar.YEAR); } /** * Gets the days in month. * * @param month the month * @param year the year * @return the days in month */ public static int getDaysInMonth(int month,int year) { switch (month) { case Calendar.JANUARY: case Calendar.marcH: case Calendar.MAY: case Calendar.JulY: case Calendar.AUGUST: case Calendar.OCTOBER: case Calendar.DECEMBER: return 31; case Calendar.APRIL: case Calendar.JUNE: case Calendar.SEPTEMBER: case Calendar.NOVEMBER: return 30; case Calendar.FEBRUARY: return (year % 4 == 0) ? 29 : 28; default: throw new IllegalArgumentException("InvalID Month"); } } /** * Gets the flow month days. * * @param flowMonth the flow month * @return the flow month days */ public static int getFlowMonthDays(int flowMonth) { int totalDays = 0; for (int i = 0; i < flowMonth; i++) { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH,i + 1); int days = getDaysInMonth(c.get(Calendar.MONTH),c.get(Calendar.YEAR)); totalDays += days; } return totalDays; } /** * Current month remain days. * * @return the int */ public static int currentMonthRemainDays() { Calendar c = Calendar.getInstance(); return getDaysInMonth(c.get(Calendar.MONTH),c.get(Calendar.YEAR)) - c.get(Calendar.DAY_OF_MONTH) + 1; } /** * Through month. * * @param calendar the calendar * @param passDays the pass days * @return the int */ public static int throughMonth(Calendar calendar,int passDays) { Calendar c = (Calendar) calendar.clone(); int curMonth = c.get(Calendar.MONTH); int curYear = c.get(Calendar.YEAR); c.add(Calendar.DAY_OF_MONTH,passDays - 1); int monthCount = (c.get(Calendar.YEAR) - curYear) * 12 + (c.get(Calendar.MONTH) - curMonth); return monthCount; } /** * Gets the days of month. * * @param calendar the calendar * @return the days of month */ public static String[] getDaysOfMonth(Calendar calendar) { Calendar month = (Calendar) calendar.clone(); String[] days; final int FirsT_DAY_OF_WEEK = 0; // Sunday = 0,Monday = 1 month.set(Calendar.DAY_OF_MONTH,1); int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); if (firstDay == 1) { days = new String[lastDay + (FirsT_DAY_OF_WEEK * 6)]; } else { days = new String[lastDay + firstDay - (FirsT_DAY_OF_WEEK + 1)]; } int j = FirsT_DAY_OF_WEEK; if (firstDay > 1) { for (j = 0; j < firstDay - FirsT_DAY_OF_WEEK; j++) { days[j] = ""; } } else { for (j = 0; j < FirsT_DAY_OF_WEEK * 6; j++) { days[j] = ""; } j = FirsT_DAY_OF_WEEK * 6 + 1; // sunday => 1,monday => 7 } int dayNumber = 1; for (int i = j - 1; i < days.length; i++) { days[i] = "" + dayNumber; dayNumber++; } return days; } /** * Gets the days of month. * * @param calendar the calendar * @param passDays the pass days * @param orderDay the order day * @return the days of month */ public static ArrayList<Day> getDaysOfMonth(Calendar calendar,String orderDay) { String[] orderInfo = null; boolean isOrdered = false; if (orderDay != null) orderInfo = orderDay.split("#"); Calendar month = (Calendar) calendar.clone(); final int FirsT_DAY_OF_WEEK = 0; // Sunday = 0,1); int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); ArrayList<Day> days = new ArrayList<Day>(); int size; if (firstDay == 1) { size = lastDay + (FirsT_DAY_OF_WEEK * 6); } else { size = lastDay + firstDay - (FirsT_DAY_OF_WEEK + 1); } for (int i = 0; i < size; i++) { days.add(new Day("",Day.DayType.NOT_ENABLE,isOrdered)); } int j = FirsT_DAY_OF_WEEK; if (firstDay > 1) { for (j = 0; j < firstDay - FirsT_DAY_OF_WEEK; j++) { days.set(j,new Day("",isOrdered)); } } else { for (j = 0; j < FirsT_DAY_OF_WEEK * 6; j++) { days.set(j,isOrdered)); } j = FirsT_DAY_OF_WEEK * 6 + 1; // sunday => 1,monday => 7 } int dayNumber = 1; for (int i = j - 1; i < days.size(); i++) { Day.DayType type; if (month.get(Calendar.YEAR) == curYear && month.get(Calendar.MONTH) == monthOfYear) { if (dayNumber >= dayOfMonth && dayNumber < dayOfMonth + passDays) { type = Day.DayType.ENABLE; if (dayNumber == dayOfMonth) { type = Day.DayType.TODAY; if (orderDay == null) { isOrdered = true; } else { isOrdered = false; } } else if (dayNumber == dayOfMonth + 1) { type = Day.DayType.TOMORROW; } else if (dayNumber == dayOfMonth + 2) { type = Day.DayType.T_D_A_T; } } else { type = Day.DayType.NOT_ENABLE; } } else { if (dayNumber <= passDays) { type = Day.DayType.ENABLE; // 明天/后天在下个月 int remainDays = getDaysInMonth(monthOfYear,curYear) - dayOfMonth; if (remainDays < 2 && dayNumber <= 2 && Math.abs(month.get(Calendar.MONTH) - monthOfYear) == 1 && month.get(Calendar.YEAR) == curYear) { if (remainDays == 1) { if (dayNumber == 1) { type = Day.DayType.T_D_A_T; } } else if (remainDays == 0) { if (dayNumber == 1) { type = Day.DayType.TOMORROW; } else if (dayNumber == 2) { type = Day.DayType.T_D_A_T; } } } } else { type = Day.DayType.NOT_ENABLE; } } if (orderInfo != null && orderInfo.length == 3 && Integer.valueOf(orderInfo[0]) == month.get(Calendar.YEAR) && Integer.valueOf(orderInfo[1]) == (month.get(Calendar.MONTH) + 1) && Integer.valueOf(orderInfo[2]) == dayNumber) { isOrdered = true; } else { isOrdered = false; } days.set(i,new Day("" + dayNumber,type,isOrdered)); dayNumber++; } return days; }}
Day.java代码:
package siso.calendarselector.lib;public class Day {public Day(String name,DayType type,boolean isOrdered) { setname(name); setType(type); setordered(isOrdered);}public enum DayType { TODAY,TOMORROW,T_D_A_T,ENABLE,NOT_ENABLE}private String name;private DayType type;private boolean isOrdered;public boolean isOrdered() { return isOrdered;}public voID setordered(boolean isOrdered) { this.isOrdered = isOrdered;}public String getname() { return name;}public voID setname(String name) { this.name = name;}public DayType getType() { return type;}public voID setType(DayType type) { this.type = type;}}
NoScrollGrIDVIEw.java代码:
package siso.calendarselector.lib;import androID.content.Context;import androID.util.AttributeSet;import androID.Widget.GrIDVIEw;public class NoScrollGrIDVIEw extends GrIDVIEw { public NoScrollGrIDVIEw(Context context) { super(context); } public NoScrollGrIDVIEw(Context context,AttributeSet attrs) { super(context,attrs); } @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); super.onMeasure(wIDthMeasureSpec,expandSpec); }}
AndroIDManifest.xml内容:
<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:ndroID="http://schemas.androID.com/apk/res-auto" package="siso.calendarselector"> <application androID:allowBackup="true" androID:icon="@mipmap/ic_launcher" androID:label="@string/app_name" androID:supportsRtl="true" ndroID:theme="@androID:style/theme.Black.NoTitlebar"> <activity androID:name=".MainActivity"> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity androID:name="siso.calendarselector.lib.CalendarSelectorActivity"> </activity> </application></manifest>
项目运行结果如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android仿淘宝预订日历(18)全部内容,希望文章能够帮你解决Android仿淘宝预订日历(18)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)