热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现日历控件示例代码

做的是一个酒店的项目,可以选择入住和离开的日期。声明为了省事在网上找的资料,自己修改的逻辑,希望对需要的朋友有帮助。喜欢的给个好评。谢谢啦!

做的是一个酒店的项目,可以选择入住和离开的日期。声明为了省事在网上找的资料,自己修改的逻辑,希望对需要的朋友有帮助。喜欢的给个好评。谢谢啦!祝生活愉快!

先上图

日历的样式,可以上下纵向滑动 

第一步,搭建布局xml



  

    

    
  


第二部在编写逻辑

 LinearLayout ll;
  MyCalendar c1;
  Date date;
  String nowday;
  long nd = 1000 * 24L * 60L * 60L;//一天的毫秒数
  SimpleDateFormat simpleDateFormat, sd1, sd2;
  SharedPreferences sp;
  SharedPreferences.Editor editor;
  private String inday, outday//日期
   sp_inday, sp_outday;//周几
 Activity  extends BaseActivity implements MyCalendar.OnDaySelectListener {

继承BaseActivity实现点击日历的监听回调

 private void init() {
    List listDate = getDateList();
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.WRAP_CONTENT);
    for (int i = 0; i  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()  getDateList() {
    List list = new ArrayList();
    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;
  }

第三部 编写监听,自定义的控件

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;

  public static final int WEEKDAYS = 7;

  public static String[] WEEK = {
      "周日",
      "周一",
      "周二",
      "周三",
      "周四",
      "周五",
      "周六"
  };

  static long nd = 1000 * 24L * 60L * 60L;//一天的毫秒数

  private List 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 date
   * @return
   */
  public static String DateToWeek(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int dayIndex = calendar.get(Calendar.DAY_OF_WEEK);
    if (dayIndex <1 || dayIndex > WEEKDAYS) {
      return null;
    }

    return WEEK[dayIndex - 1];
  }

  /**
   * 获得天数差
   *
   * @param begin
   * @param end
   * @return
   */
  public static long getDayDiff(Date begin, Date end) {
    long day = 1;
    if (end.getTime() ();//存放天
    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<&#63;> 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  gvList;//存放天
    String inday, outday;

    public calendarGridViewAdapter(List 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() 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;
  }
}

在界面显示选择的日期

看图 

接下来就是为了显示选择的日期进行逻辑判断,包括字符串的转换以及日期格式的转换,日期的计算等。

simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    if ("".equals(home_into_date.getText().toString())
        && "".equals(home_out_date.getText().toString())) {
      inday = simpleDateFormat.format(new Date());
      try {
        //转换时间格式
        String changeDate = MyCalendar.format1(inday);

        Date dateIn = simpleDateFormat.parse(inday);
        //将日期转换成周
        String weekIn = MyCalendar.DateToWeek(dateIn);
        home_into_date.setText("" + changeDate + weekIn);
        String nextDay = MyCalendar.format1(MyCalendar.getSpecifiedDayAfter(inday));
        Date dateOut = simpleDateFormat.parse(MyCalendar.getSpecifiedDayAfter(inday));
        String weekOut = MyCalendar.DateToWeek(dateOut);
        home_out_date.setText("" + nextDay + weekOut);
        long days = MyCalendar.getDayDiff(dateIn, dateOut);
        home_total_days.setText("共" + (days - 1) + "晚");
      } catch (ParseException e) {
        e.printStackTrace();
      }
    } else {
    //这里使用sp传的值
      inday = pro.getString("dateIn", "");
      outday = pro.getString("dateOut", "");
      try {
        String changeDate = MyCalendar.format1(inday);
        Date dateIn = simpleDateFormat.parse(inday);
        //将日期转换成周
        String weekIn = MyCalendar.DateToWeek(dateIn);
        home_into_date.setText("" + changeDate + weekIn);
        String outDay = MyCalendar.format1(outday);
        Date dateOut = simpleDateFormat.parse(outday);
        String weekOut = MyCalendar.DateToWeek(dateOut);
        home_out_date.setText("" + outDay + weekOut);
        long days = MyCalendar.getDayDiff(dateIn, dateOut);
        home_total_days.setText("共" + (days - 1) + "晚");
      } catch (ParseException e) {
        e.printStackTrace();
      }

其中有几个布局,给图自己写吧

comm_calendar

这里写图片描述 

common_calendar_gridview_item



    

      

      
    

    
  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • svnstat查看当前目录下svn状态svnremovexxxxsvnaddxx ... [详细]
  • ANR一般有三种类型: ... [详细]
  • 6.列表表格列表(1)liststyle基本语法语法取值使用说明设置列表项目相关样式。当liststyleimage和liststyletype都被指定了时,liststyleim ... [详细]
  • 室内外一体化建模
    http:www.fx361.compage20180913422182 ... [详细]
  • 简介if循环ifconditonthencommandselsecommandfielse这部分没有可以省略或者ifconditionthencommandselseifcondi ... [详细]
  • 标准ACL配置
    标准ACL的表号是1~99中的一个数字permit|d ... [详细]
  • 问题描述为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理。管理器具备的功能主要有:1、查看DVD信息。菜单选择查看功能,展示DVD的信息。2、新增DVD信息选 ... [详细]
  • 1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?rea ... [详细]
  • 5分钟攻克NDK开发中javah不能反编译的问题
    网上关于javah不能反编译出.h头文件的问题的资料本来就不多,而且大多似乎已经过时,给出的几种解决方法都没有切中要害。害得我苦苦找了一天,终于修成正果。特分享如下:这是我最终 ... [详细]
  • 系统被描述为不依赖于底层技术的服务服务通过消息实现1SOA涉及到服务的提供者和消费者参与SOA的系统是服务提供者,还是服务的消费者,要视工作流而定服务和消息是无状态的2服务和消费者 ... [详细]
  • 100寸触摸一体机是匠能电子一款大尺寸的触摸产品,它本身自带安卓系统和windows操作系统,可以当作一台大电脑使用,查询、播放于一体。另外100寸触摸一体机还具有显示器功能,把设 ... [详细]
  • jenkins 邮件配置步骤
    一、进行系统管理中的邮件配置步骤:1、设置ExtendedE-mailNotification二、对构建的job添加邮件发送的步骤: ... [详细]
  • 时会_小5聊C# 通过将DataTable转为List泛型遇到的问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了小5聊C#通过将DataTable转为List泛型遇到的问题相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ***实现文本复制功能**paramcontent*publicstaticvoidcopy(Stringcontent,Contextcontext){得到剪贴板管理器Clipb ... [详细]
  • http:nickycc.lofter.compost23e2a6_17d6a07http:blog.csdn.netl25000articledetails46842013htt ... [详细]
author-avatar
手机用户2602920567
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有