这个也是看网上大神的例子,自己改的弹Dialog的双时间选择,在改的过程中也有问题,不多说,上图上代码:
1.主类:MainActivity
public class MainActivity extends FragmentActivity implements View.OnClickListener{ private Button btn; private static TextView tv_in,tv_out; CalendarDialog mCalendarDialog; static String inday,outday; static SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sp=getSharedPreferences("date",Context.MODE_PRIVATE); btn=(Button) findViewById(R.id.btn); btn.setOnClickListener(this); tv_in=(TextView) findViewById(R.id.tv_in); tv_out=(TextView) findViewById(R.id.tv_out); getDate(inday,outday); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn: mCalendarDialog = new CalendarDialog(this,new MainActivity()); if (mCalendarDialog.isVisible()) { mCalendarDialog.dismiss(); } else { mCalendarDialog.show(getSupportFragmentManager(), "date");; } break; } } public static void getDate(String inday,String outday){ inday=sp.getString("dateIn", ""); outday=sp.getString("dateOut", ""); if(!"".equals(inday)){ tv_in.setText(inday); } if(!"".equals(outday)){ tv_out.setText(outday); } }}
2、主布局:activity_main
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择日期" android:layout_marginBottom="20dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp" android:layout_margin="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="入住日期:" /> <TextView android:id="@+id/tv_in" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp" android:layout_margin="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="离开日期:" /> <TextView android:id="@+id/tv_out" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" /> </LinearLayout></LinearLayout>
3、CalendarDialog类
public class CalendarDialog extends DialogFragment implements OnClickListener ,MyCalendar.OnDaySelectListener { LinearLayout ll; SimpleDateFormat simpleDateFormat,sd1,sd2; SharedPreferences sp; SharedPreferences.Editor editor; private String inday,outday,sp_inday,sp_outday; String nowday; MyCalendar c1; Context context; MainActivity activity; public CalendarDialog(Context context,MainActivity activity){ this.context = context; this.activity = activity; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 使用不带theme的构造器,获得的dialog边框距离屏幕仍有几毫米的缝隙。 // Dialog dialog = new Dialog(getActivity()); Dialog dialog = new Dialog(getActivity(), R.style.CalendarDialog); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // must be called before set content dialog.setContentView(R.layout.calendar_dialog_layout); dialog.setCanceledOnTouchOutside(true); // 设置宽度为屏宽、靠近屏幕底部。 Window window = dialog.getWindow(); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(wlp); ll=(LinearLayout) dialog.findViewById(R.id.ll); iniData(); return dialog; } private void iniData() { sp=context.getSharedPreferences("date", Context.MODE_PRIVATE); //本地保存 sp_inday=sp.getString("dateIn", ""); sp_outday=sp.getString("dateOut", ""); editor=sp.edit(); simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd"); nowday=simpleDateFormat.format(new Date()); sd1=new SimpleDateFormat("yyyy"); sd2=new SimpleDateFormat("dd"); init(); } private void init(){ List<String> listDate=getDateList(); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); for(int i=0;i<listDate.size();i++){ c1 = new MyCalendar(context); c1.setLayoutParams(params); Date date=null; try { date=simpleDateFormat.parse(listDate.get(i)); } catch (ParseException e) { e.printStackTrace(); } if(!"".equals(sp_inday)){ c1.setInDay(sp_inday); } if(!"".equals(sp_outday)){ c1.setOutDay(sp_outday); } c1.setTheDay(date); c1.setOnDaySelectListener(this); ll.addView(c1); } } @Override public void onDaySelectListener(View view, String date) { //若日历日期小于当前日期,或日历日期-当前日期超过三个月,则不能点击 try { if(simpleDateFormat.parse(date).getTime()<simpleDateFormat.parse(nowday).getTime()){ return; } long dayxc=(simpleDateFormat.parse(date).getTime()-simpleDateFormat.parse(nowday).getTime())/nd; if(dayxc>90){ return; } } catch (ParseException e) { e.printStackTrace(); } //若以前已经选择了日期,则在进入日历后会显示以选择的日期,该部分作用则是重新点击日历时,清空以前选择的数据(包括背景图案) if(!"".equals(sp_inday)){ c1.viewIn.setBackgroundColor(Color.WHITE); ((TextView) c1.viewIn.findViewById(R.id.tv_calendar_day)).setTextColor(Color.BLACK); ((TextView) c1.viewIn.findViewById(R.id.tv_calendar)).setText(""); } if(!"".equals(sp_outday)){ c1.viewOut.setBackgroundColor(Color.WHITE); ((TextView) c1.viewOut.findViewById(R.id.tv_calendar_day)).setTextColor(Color.BLACK); ((TextView) c1.viewOut.findViewById(R.id.tv_calendar)).setText(""); } String dateDay=date.split("-")[2]; if(Integer.parseInt(dateDay)<10){ dateDay=date.split("-")[2].replace("0", ""); } TextView textDayView=(TextView) view.findViewById(R.id.tv_calendar_day); TextView textView=(TextView) view.findViewById(R.id.tv_calendar); view.setBackgroundColor(Color.parseColor("#33B5E5")); textDayView.setTextColor(Color.WHITE); if(null==inday||inday.equals("")){ textDayView.setText(dateDay); textView.setText("入住"); inday=date; }else{ if(inday.equals(date)){ view.setBackgroundColor(Color.WHITE); textDayView.setText(dateDay); textDayView.setTextColor(Color.BLACK); textView.setText(""); inday=""; }else{ try { if(simpleDateFormat.parse(date).getTime()<simpleDateFormat.parse(inday).getTime()){ view.setBackgroundColor(Color.WHITE); textDayView.setTextColor(Color.BLACK); Toast.makeText(context, "离开日期不能小于入住日期", Toast.LENGTH_SHORT).show(); return; } } catch (ParseException e) { e.printStackTrace(); } textDayView.setText(dateDay); textView.setText("离开"); outday=date; editor.putString("dateIn", inday); editor.putString("dateOut", outday); editor.commit(); MainActivity.getDate(inday,outday); dismiss(); } } } //根据当前日期,向后数三个月(若当前day不是1号,为满足至少90天,则需要向后数4个月) @SuppressLint("SimpleDateFormat") public List<String> getDateList(){ List<String> list=new ArrayList<String>(); Date date=new Date(); int nowMon=date.getMonth()+1; String yyyy=sd1.format(date); String dd=sd2.format(date); if(nowMon==9){ list.add(simpleDateFormat.format(date)); list.add(yyyy+"-10-"+dd); list.add(yyyy+"-11-"+dd); if(!dd.equals("01")){ list.add(yyyy+"-12-"+dd); } }else if(nowMon==10){ list.add(yyyy+"-10-"+dd); list.add(yyyy+"-11-"+dd); list.add(yyyy+"-12-"+dd); if(!dd.equals("01")){ list.add((Integer.parseInt(yyyy)+1)+"-01-"+dd); } }else if(nowMon==11){ list.add(yyyy+"-11-"+dd); list.add(yyyy+"-12-"+dd); list.add((Integer.parseInt(yyyy)+1)+"-01-"+dd); if(!dd.equals("01")){ list.add((Integer.parseInt(yyyy)+1)+"-02-"+dd); } }else if(nowMon==12){ list.add(yyyy+"-12-"+dd); list.add((Integer.parseInt(yyyy)+1)+"-01-"+dd); list.add((Integer.parseInt(yyyy)+1)+"-02-"+dd); if(!dd.equals("01")){ list.add((Integer.parseInt(yyyy)+1)+"-03-"+dd); } }else{ list.add(yyyy+"-"+getMon(nowMon)+"-"+dd); list.add(yyyy+"-"+getMon((nowMon+1))+"-"+dd); list.add(yyyy+"-"+getMon((nowMon+2))+"-"+dd); if(!dd.equals("01")){ list.add(yyyy+"-"+getMon((nowMon+3))+"-"+dd); } } return list; } public String getMon(int mon){ String month=""; if(mon<10){ month="0"+mon; }else{ month=""+mon; } return month; } @Override public void onClick(View v) { }}
4、MyGridView类
public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
5、布局:comm_calendar.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="400dp" android:orientation="vertical"> <!--<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:gravity="center" android:background="#F5F6F7"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请选择入住时间" android:textSize="15dp"/> </LinearLayout>--> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="horizontal" android:background="#FFFFFF"> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:paddingLeft="20dp"> <ImageView android:layout_width="15dp" android:layout_height="15dp" android:background="@mipmap/ic_launcher"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:orientation="horizontal" android:gravity="center"> <TextView android:id="@+id/tv_year" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2015年" android:textColor="#FF6600" android:textSize="14sp" android:visibility="visible"/> <TextView android:id="@+id/tv_month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="7" android:textColor="#FF6600" android:textSize="14sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="月" android:textColor="#FF6600" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:paddingRight="20dp"> <ImageView android:layout_width="15dp" android:layout_height="15dp" android:background="@mipmap/ic_launcher"/> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="30dip" android:background="#FFFFFF" android:orientation="horizontal" > <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="日" android:textColor="#FF6600" android:textSize="15sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="一" android:textColor="#999999" android:textSize="13sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="二" android:textColor="#999999" android:textSize="13sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="三" android:textColor="#999999" android:textSize="13sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="四" android:textColor="#999999" android:textSize="13sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="五" android:textColor="#999999" android:textSize="13sp" /> <TextView android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="六" android:textColor="#FF6600" android:textSize="13sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#FFFFFF" android:orientation="vertical" > <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#E4E4E4" /> <com.calendar.date.dialog.MyGridView android:id="@+id/gv_calendar" android:layout_width="match_parent" android:layout_height="match_parent" android:horizontalSpacing="0dp" android:listSelector="@null" android:numColumns="7" android:stretchMode="columnWidth" android:verticalSpacing="0dp"/> </LinearLayout></LinearLayout>
6、布局:common_calendar_gridview_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:paddingTop="5dp" android:paddingBottom="5dp"> <TextView android:id="@+id/tv_calendar_day" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_gravity="center" android:textSize="14sp" android:text="01"/> <TextView android:id="@+id/tv_calendar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:textColor="#FFFFFF" android:textSize="11sp" android:text="入住"/> </LinearLayout> </LinearLayout></LinearLayout>
7、MyCalendar类:
public class MyCalendar extends LinearLayout { private static Context context; private Date theInDay; private String inday="",outday=""; public static View viewIn; public static View viewOut; public static String positionIn; public static String positionOut; static long nd = 1000*24L*60L*60L;//一天的毫秒数 private List<String> gvList ;//存放天 private OnDaySelectListener callBack;//回调函数 private static String nowday= new SimpleDateFormat("yyyy-MM-dd").format(new Date()) ; private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMM");//日期格式化 private static SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd");//日期格式化 /** * 构造函数 * @param context */ public MyCalendar(Context context) { super(context); MyCalendar.context = context; } /** * 构造函数 * @param context */ public MyCalendar(Context context, AttributeSet attrs) { super(context, attrs); MyCalendar.context = context; } public void setInDay(String inday){ this.inday=inday; } public void setOutDay(String outday){ this.outday=outday; } public void setTheDay(Date dateIn){ this.theInDay=dateIn; init(); } /** * 初始化日期以及view等控件 */ private void init() { gvList = new ArrayList<String>();//存放天 final Calendar cal = Calendar.getInstance();//获取日历实例 cal.setTime(theInDay);//cal设置为当天的 cal.set(Calendar.DATE, 1);//cal设置当前day为当前月第一天 int tempSum = countNeedHowMuchEmpety(cal);//获取当前月第一天为星期几 int dayNumInMonth = getDayNumInMonth(cal);//获取当前月有多少天 setGvListData(tempSum, dayNumInMonth,cal.get(Calendar.YEAR)+"-"+getMonth((cal.get(Calendar.MONTH)+1))); View view = LayoutInflater.from(context).inflate(R.layout.comm_calendar, this, true);//获取布局,开始初始化 TextView tv_year= (TextView) view.findViewById(R.id.tv_year); if(cal.get(Calendar.YEAR)>new Date().getYear()){ tv_year.setVisibility(View.VISIBLE); tv_year.setText(cal.get(Calendar.YEAR)+"年"); } TextView tv_month= (TextView) view.findViewById(R.id.tv_month); tv_month.setText(String.valueOf(theInDay.getMonth()+1)); MyGridView gv = (MyGridView) view.findViewById(R.id.gv_calendar); calendarGridViewAdapter gridViewAdapter = new calendarGridViewAdapter(gvList,inday,outday); gv.setAdapter(gridViewAdapter); gv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View arg1,int position, long arg3) { String choiceDay = (String) adapterView.getAdapter().getItem(position); String[] date=choiceDay.split(","); String day=date[1]; if (!" ".equals(day)) { if (Integer.parseInt(day) < 10) { day = "0" + date[1]; } choiceDay = date[0] +"-"+ day; if (callBack != null) {//调用回调函数回调数据 callBack.onDaySelectListener(arg1,choiceDay); } } } }); } /** * 为gridview中添加需要展示的数据 * @param tempSum * @param dayNumInMonth */ private void setGvListData(int tempSum, int dayNumInMonth,String YM) { gvList.clear(); for (int i = 0; i < tempSum; i++) { gvList.add(" , "); } for (int j = 1; j <= dayNumInMonth; j++) { gvList.add(YM+","+String.valueOf(j)); } } private String getMonth(int month) { String mon=""; if(month<10){ mon="0"+month; }else{ mon=""+month; } return mon; } /** * 获取当前月的总共天数 * @param cal * @return */ private int getDayNumInMonth(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * 获取当前月第一天在第一个礼拜的第几天,得出第一天是星期几 * @param cal * @return */ private int countNeedHowMuchEmpety(Calendar cal) { int firstDayInWeek = cal.get(Calendar.DAY_OF_WEEK) - 1; return firstDayInWeek; } /** * gridview中adapter的viewholder * @author Administrator * */ static class GrideViewHolder { TextView tvDay,tv; } /** * gridview的adapter * @author Administrator * */ static class calendarGridViewAdapter extends BaseAdapter { List<String> gvList ;//存放天 String inday,outday; public calendarGridViewAdapter(List<String> gvList,String inday,String outday){ super(); this.gvList=gvList; this.inday=inday; this.outday=outday; } @Override public int getCount() { return gvList.size(); } @Override public String getItem(int position) { return gvList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { GrideViewHolder holder; if (convertView == null) { holder = new GrideViewHolder(); convertView = inflate(context,R.layout.common_calendar_gridview_item, null); holder.tv = (TextView) convertView.findViewById(R.id.tv_calendar); holder.tvDay = (TextView) convertView.findViewById(R.id.tv_calendar_day); convertView.setTag(holder); } else { holder = (GrideViewHolder) convertView.getTag(); } String[] date=getItem(position).split(","); holder.tvDay.setText(date[1]); if((position+1)%7==0||(position)%7==0){ holder.tvDay.setTextColor(Color.parseColor("#339900")); } if(!date[1].equals(" ")){ String day=date[1]; if(Integer.parseInt(date[1])<10){ day="0"+date[1]; } if((date[0]+"-"+day).equals(nowday)){ holder.tvDay.setTextColor(Color.parseColor("#FF6600")); holder.tvDay.setTextSize(15); holder.tvDay.setText("今天"); } if(!"".equals(inday)&&(date[0]+"-"+day).equals(inday)){ convertView.setBackgroundColor(Color.parseColor("#33B5E5")); holder.tvDay.setTextColor(Color.WHITE); holder.tvDay.setText(date[1]); holder.tv.setText("入住"); viewIn=convertView; positionIn=date[1]; } if(!"".equals(outday)&&(date[0]+"-"+day).equals(outday)){ convertView.setBackgroundColor(Color.parseColor("#33B5E5")); holder.tvDay.setTextColor(Color.WHITE); holder.tvDay.setText(date[1]); holder.tv.setText("离开"); viewOut=convertView; positionOut=date[1]; } try { //若日历日期<当前日期,则不能选择 if(dateFormat2.parse(date[0]+"-"+day).getTime()<dateFormat2.parse(nowday).getTime()){ holder.tvDay.setTextColor(Color.parseColor("#999999")); } //若日历日期-当前日期>90天,则不能选择 long dayxc=(dateFormat2.parse(date[0]+"-"+day).getTime()-dateFormat2.parse(nowday).getTime())/nd; if(dayxc>90){ holder.tvDay.setTextColor(Color.parseColor("#999999")); } } catch (ParseException e) { e.printStackTrace(); } } return convertView; } } /** * 自定义监听接口 * @author Administrator * */ public interface OnDaySelectListener { void onDaySelectListener(View view, String date); } /** * 自定义监听接口设置对象 * @param o */ public void setOnDaySelectListener(OnDaySelectListener o) { callBack = o; }}
8、布局:calendar_dialog_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:background="#F5F6F7"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请选择入住时间" android:textSize="15dp"/> </LinearLayout> <ScrollView android:layout_width="match_parent" android:layout_height="280dp"> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="300dp" android:orientation="vertical" > </LinearLayout> </ScrollView></LinearLayout>
9、style中要添加:
style name="CalendarDialog" parent="@style/AppTheme"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:windowIsFloating">true</item> </style>
10、可能顺序有点乱,且不够完善,望有大神有更好例子分享下给我下,谢谢!
源码地址:上传后公布