国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)日歷控件示例代碼

2019-12-12 03:29:53
字體:
供稿:網(wǎng)友

做的是一個酒店的項目,可以選擇入住和離開的日期。聲明為了省事在網(wǎng)上找的資料,自己修改的邏輯,希望對需要的朋友有幫助。喜歡的給個好評。謝謝啦!祝生活愉快!

先上圖

日歷的樣式,可以上下縱向滑動 

第一步,搭建布局xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  android:layout_width="match_parent"  android:layout_height="match_parent">  <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical">    <FrameLayout      android:layout_width="match_parent"      android:layout_height="wrap_content">      <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@color/days_detail"        android:gravity="center"        android:padding="16dp"        android:text="選擇住店離店日期"        android:textColor="@color/white"        android:textSize="18sp" />      <ImageView        android:id="@+id/back_to_up"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:layout_marginTop="10dp"        android:src="@drawable/backto" />    </FrameLayout>    <FrameLayout      android:layout_width="match_parent"      android:layout_height="wrap_content">      <View        android:layout_width="match_parent"        android:layout_height="30dp"        android:background="@color/days_detail" />      <android.support.v7.widget.CardView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:layout_marginTop="20dp"        android:padding="10dp"        app:cardCornerRadius="10dp"        app:cardElevation="16dp">        <LinearLayout          android:id="@+id/ll"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:orientation="vertical" />      </android.support.v7.widget.CardView>    </FrameLayout>  </LinearLayout></ScrollView>

第二部在編寫邏輯

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

繼承BaseActivity實現(xiàn)點擊日歷的監(jiān)聽回調(diào)

 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(this);      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();    }    //若以前已經(jīng)選擇了日期,則在進入日歷后會顯示以選擇的日期,該部分作用則是重新點擊日歷時,清空以前選擇的數(shù)據(jù)(包括背景圖案)    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(CalendarActivity.this, "離開日期不能小于入住日期", 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();        finish();      }    }  }  //根據(jù)當前日期,向后數(shù)三個月(若當前day不是1號,為滿足至少90天,則需要向后數(shù)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;  }

第三部 編寫監(jiān)聽,自定義的控件

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;//一天的毫秒數(shù)  private List<String> gvList;//存放天  private OnDaySelectListener callBack;//回調(diào)函數(shù)  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");//日期格式化  /**   * 構造函數(shù)   *   * @param context   */  public MyCalendar(Context context) {    super(context);    MyCalendar.context = context;  }  /**   * 日期變量轉(zhuǎn)成對應的星期字符串   *   * @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];  }  /**   * 獲得天數(shù)差   *   * @param begin   * @param end   * @return   */  public static long getDayDiff(Date begin, Date end) {    long day = 1;    if (end.getTime() < begin.getTime()) {      day = -1;    } else if (end.getTime() == begin.getTime()) {      day = 1;    } else {      day += (end.getTime() - begin.getTime()) / (24 * 60 * 60 * 1000);    }    return day;  }  /**   * 將yyyy-MM-dd類型轉(zhuǎn)換成MM.dd   *   * @param time   * @return   * @throws ParseException   */  public static String format1(String time) throws ParseException {    SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);    SimpleDateFormat to = new SimpleDateFormat("MM.dd", Locale.CHINA);    return to.format(from.parse(time));  }  /**   * 獲得指定日期的后一天   *   * @param specifiedDay   * @return   */  public static String getSpecifiedDayAfter(String specifiedDay) {    Calendar c = Calendar.getInstance();    Date date = null;    try {      date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);    } catch (ParseException e) {      e.printStackTrace();    }    c.setTime(date);    int day = c.get(Calendar.DATE);    c.set(Calendar.DATE, day + 1);    String dayAfter = new SimpleDateFormat("yyyy-MM-dd")        .format(c.getTime());    return dayAfter;  }  /**   * 構造函數(shù)   *   * @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) {//調(diào)用回調(diào)函數(shù)回調(diào)數(shù)據(jù)            callBack.onDaySelectListener(arg1, choiceDay);          }        }      }    });  }  /**   * 為gridview中添加需要展示的數(shù)據(jù)   *   * @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;  }  /**   * 獲取當前月的總共天數(shù)   *   * @param cal   * @return cal.getActualMaximum(Calendar.DATE)   */  private int getDayNumInMonth(Calendar cal) {    return cal.getActualMaximum(Calendar.DATE);  }  /**   * 獲取當前月第一天在第一個禮拜的第幾天,得出第一天是星期幾   *   * @param cal   * @return firstDayInWeek   */  private int countNeedHowMuchEmpety(Calendar cal) {    int firstDayInWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;    Log.e("MyCalendar", String.valueOf(firstDayInWeek));    return firstDayInWeek;  }  /**   * gridview中adapter的viewholder   *   * @author wx   */  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;    }  }  /**   * 自定義監(jiān)聽接口   *   * @author Administrator   */  public interface OnDaySelectListener {    void onDaySelectListener(View view, String date);  }  /**   * 自定義監(jiān)聽接口設置對象   *   * @param o   */  public void setOnDaySelectListener(OnDaySelectListener o) {    callBack = o;  }}

在界面顯示選擇的日期

看圖 

接下來就是為了顯示選擇的日期進行邏輯判斷,包括字符串的轉(zhuǎn)換以及日期格式的轉(zhuǎn)換,日期的計算等。

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 {        //轉(zhuǎn)換時間格式        String changeDate = MyCalendar.format1(inday);        Date dateIn = simpleDateFormat.parse(inday);        //將日期轉(zhuǎn)換成周        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);        //將日期轉(zhuǎn)換成周        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

<LinearLayout    android:layout_width="0dp"    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">      <TextView        android:id="@+id/tv_calendar_day"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:gravity="center"        android:textSize="15sp" />      <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="15sp" />    </LinearLayout>    <View      android:layout_width="match_parent"      android:layout_height="0.5dp"      android:background="#E4E4E4" />  </LinearLayout>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长乐市| 陕西省| 长丰县| 漳浦县| 云梦县| 永寿县| 庄浪县| 邵东县| 塔河县| 迭部县| 缙云县| 崇左市| 武定县| 贵德县| 平顺县| 丹阳市| 灵寿县| 安吉县| 彩票| 昭通市| 祁东县| 棋牌| 大兴区| 资中县| 额尔古纳市| 禄丰县| 北辰区| 盖州市| 桦南县| 新昌县| 汉沽区| 德钦县| 嘉黎县| 甘孜县| 湘阴县| 阳城县| 衡山县| 宁南县| 安达市| 吴江市| 鲁甸县|