这是之情在网上找的一个例子,具体是谁写的忘记了。之后自己稍稍做了一些改动。设计了一个关于考勤的日历显示方案。
日历星期一到星期日的抬头自定义view
1 public class WeekDayView extends View { 2 //上横线颜色 3 private int mTopLineColor = Color.parseColor("#CCE4F2"); 4 //下横线颜色 5 private int mBottomLineColor = Color.parseColor("#CCE4F2"); 6 //周一到周五的颜色 7 private int mWeedayColor = Color.parseColor("#1FC2F3"); 8 //周六、周日的颜色 9 private int mWeekendColor = Color.parseColor("#fa4451"); 10 //线的宽度 11 private int mStrokeWidth = 4; 12 private int mWeekSize = 14; 13 private Paint paint; 14 private DisplayMetrics mDisplayMetrics; 15 private String[] weekString = new String[]{"日","一","二","三","四","五","六"}; 16 17 public WeekDayView(Context context) { 18 super(context); 19 mDisplayMetrics = getResources().getDisplayMetrics(); 20 paint = new Paint(); 21 } 22 23 public WeekDayView(Context context, AttributeSet attrs) { 24 super(context, attrs); 25 mDisplayMetrics = getResources().getDisplayMetrics(); 26 paint = new Paint(); 27 } 28 29 @Override 30 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 31 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 32 int widthSize = MeasureSpec.getSize(widthMeasureSpec); 33 int widthMode = MeasureSpec.getMode(widthMeasureSpec); 34 35 int heightSize = MeasureSpec.getSize(heightMeasureSpec); 36 int heightMode = MeasureSpec.getMode(heightMeasureSpec); 37 38 // int width = getMySize(100, widthMeasureSpec); 39 // int height = getMySize(100, heightMeasureSpec); 40 41 if(heightMode == MeasureSpec.AT_MOST){ 42 heightSize = mDisplayMetrics.densityDpi * 30; 43 } 44 if(widthMode == MeasureSpec.AT_MOST){ 45 widthSize = mDisplayMetrics.densityDpi * 300; 46 } 47 setMeasuredDimension(widthSize, heightSize); 48 } 49 50 private int getMySize(int defaultSize, int measureSpec) { 51 int mySize = defaultSize; 52 53 int mode = MeasureSpec.getMode(measureSpec); 54 int size = MeasureSpec.getSize(measureSpec); 55 56 switch (mode) { 57 case MeasureSpec.UNSPECIFIED: {//如果没有指定大小,就设置为默认大小 58 mySize = defaultSize; 59 break; 60 } 61 case MeasureSpec.AT_MOST: {//如果测量模式是最大取值为size 62 //我们将大小取最大值,你也可以取其他值 63 mySize = size; 64 break; 65 } 66 case MeasureSpec.EXACTLY: {//如果是固定的大小,那就不要去改变它 67 mySize = size; 68 break; 69 } 70 } 71 return mySize; 72 } 73 74 @Override 75 protected void onDraw(Canvas canvas) { 76 int width = getWidth(); 77 int height = getHeight(); 78 //进行画上下线 79 paint.setStyle(Paint.Style.STROKE); 80 paint.setColor(mTopLineColor); 81 paint.setStrokeWidth(mStrokeWidth); 82 // canvas.drawLine(0, 0, width, 0, paint); 83 84 //画下横线 85 paint.setColor(mBottomLineColor); 86 // canvas.drawLine(0, height, width, height, paint); 87 paint.setStyle(Paint.Style.FILL); 88 paint.setTextSize(mWeekSize * mDisplayMetrics.scaledDensity); 89 int columnWidth = width / 7; 90 for(int i=0;i < weekString.length;i++){ 91 String text = weekString[i]; 92 int fontWidth = (int) paint.measureText(text); 93 int startX = columnWidth * i + (columnWidth - fontWidth)/2; 94 int startY = (int) (height/2 - (paint.ascent() + paint.descent())/2); 95 if(text.indexOf("日") > -1|| text.indexOf("六") > -1){ 96 paint.setColor(mWeekendColor); 97 }else{ 98 paint.setColor(mWeedayColor); 99 } 100 canvas.drawText(text, startX, startY, paint); 101 } 102 } 103 104 /** 105 * 设置顶线的颜色 106 * @param mTopLineColor 107 */ 108 public void setmTopLineColor(int mTopLineColor) { 109 this.mTopLineColor = mTopLineColor; 110 } 111 112 /** 113 * 设置底线的颜色 114 * @param mBottomLineColor 115 */ 116 public void setmBottomLineColor(int mBottomLineColor) { 117 this.mBottomLineColor = mBottomLineColor; 118 } 119 120 /** 121 * 设置周一-五的颜色 122 * @return 123 */ 124 public void setmWeedayColor(int mWeedayColor) { 125 this.mWeedayColor = mWeedayColor; 126 } 127 128 /** 129 * 设置周六、周日的颜色 130 * @param mWeekendColor 131 */ 132 public void setmWeekendColor(int mWeekendColor) { 133 this.mWeekendColor = mWeekendColor; 134 } 135 136 /** 137 * 设置边线的宽度 138 * @param mStrokeWidth 139 */ 140 public void setmStrokeWidth(int mStrokeWidth) { 141 this.mStrokeWidth = mStrokeWidth; 142 } 143 /** 144 * 设置字体的大小 145 * @param mWeekSize 146 */ 147 public void setmWeekSize(int mWeekSize) { 148 this.mWeekSize = mWeekSize; 149 } 150 /** 151 * 设置星期的形式 152 * @param weekString 153 * 默认值 "日","一","二","三","四","五","六" 154 */ 155 public void setWeekString(String[] weekString) { 156 this.weekString = weekString; 157 } 158 }
日历的自定义veiw
1 public class MonthDateView extends View { 2 private static final int NUM_COLUMNS = 7; 3 private static final int NUM_ROWS = 6; 4 private Paint mPaint; 5 private int textColor = Color.parseColor("#232323"); 6 private int mDayColor = Color.parseColor("#e7e7e7");//灰色 7 private int mSelectDayColor = Color.parseColor("#a6f297");//绿色 8 private int mSelectBGColor = Color.parseColor("#b5ecff");//蓝色 9 private int mCurrentColor = Color.parseColor("#ffdeb4");//橙色 10 private int mTextColor = Color.parseColor("#333333");//灰色 11 private int mTextColor1 = Color.parseColor("#FFFFFF");//黑色 12 private int mCurrYear,mCurrMonth,mCurrDay; 13 private int mSelYear,mSelMonth,mSelDay; 14 private int mColumnSize,mRowSize; 15 private DisplayMetrics mDisplayMetrics; 16 private int mDaySize = 14; 17 private TextView tv_date,tv_week; 18 private int weekRow; 19 private int [][] daysString; 20 private int mCircleRadius = 6; 21 private DateClick dateClick; 22 private int mCircleColor = Color.parseColor("#ff0000"); 23 private List<Integer> daysHasThingList; 24 private Map<String,String> valuesMap; 25 private String[] sd; 26 private String[] ed; 27 private DayOnClickLinser linser; 28 29 30 public MonthDateView(Context context, AttributeSet attrs) { 31 super(context, attrs); 32 mDisplayMetrics = getResources().getDisplayMetrics(); 33 Calendar calendar = Calendar.getInstance(); 34 calendar.setTime(new Date()); 35 mPaint = new Paint(); 36 //去锯齿 37 mPaint.setAntiAlias(true); 38 mPaint.setStrokeWidth((float) 4.0); 39 mPaint.setStyle(Paint.Style.STROKE); 40 mCurrYear = calendar.get(Calendar.YEAR); 41 mCurrMonth = calendar.get(Calendar.MONTH)+1; 42 mCurrDay = calendar.get(Calendar.DATE); 43 setSelectYearMonth(mCurrYear,mCurrMonth,mCurrDay); 44 } 45 46 @Override 47 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 48 int widthSize = MeasureSpec.getSize(widthMeasureSpec); 49 int widthMode = MeasureSpec.getMode(widthMeasureSpec); 50 51 int heightSize = MeasureSpec.getSize(heightMeasureSpec); 52 int heightMode = MeasureSpec.getMode(heightMeasureSpec); 53 54 if(heightMode == MeasureSpec.AT_MOST){ 55 heightSize = mDisplayMetrics.densityDpi * 200; 56 } 57 if(widthMode == MeasureSpec.AT_MOST){ 58 widthSize = mDisplayMetrics.densityDpi * 300; 59 } 60 setMeasuredDimension(widthSize, heightSize); 61 } 62 63 @Override 64 protected void onDraw(Canvas canvas) { 65 initSize(); 66 daysString = new int[6][7];//日期数字6行7列 67 mPaint.setTextSize(mDaySize*mDisplayMetrics.scaledDensity); 68 mPaint.setColor(mTextColor1); 69 int dayString; 70 int mMonthDays = DateUtil.getMonthDays(mSelYear, mSelMonth); 71 int weekNumber = DateUtil.getFirstDayWeek(mSelYear, mSelMonth); 72 Log.d("DateView", "DateView:" + mSelMonth+"月1号周" + weekNumber); 73 for(int day = 0;day < mMonthDays;day++){ 74 dayString = day + 1; 75 int column = (day+weekNumber) % 7; 76 int row = (day+weekNumber ) / 7; 77 daysString[row][column]=day + 1; 78 int startX = (int) (mColumnSize * column + (mColumnSize - mPaint.measureText(dayString+""))/2); 79 int startY = (int) (mRowSize * row + mRowSize/2 - (mPaint.ascent() + mPaint.descent())/2); 80 81 //绘制背景色矩形 82 int startRecX = mColumnSize * column; 83 int startRecY = mRowSize * row; 84 int cx = startRecX+mColumnSize/2; 85 int cy = startRecY+mRowSize/2; 86 // if(dayString==mSelDay){ 87 // int endRecX = startRecX + mColumnSize; 88 // int endRecY = startRecY + mRowSize; 89 // mPaint.setColor(mSelectBGColor); 90 // canvas.drawRect(startRecX, startRecY, endRecX, endRecY, mPaint); 91 // //绘制圆形 92 // canvas.drawCircle(cx, cy, 30, mPaint); 93 // //记录第几行,即第几周 94 // weekRow = row + 1; 95 // } 96 // 绘制事务圆形标志 97 // drawCircle(row,column,day + 1,canvas); 98 String time = null; 99 if (dayString<=mCurrDay||mSelMonth<mCurrMonth||mSelYear<mCurrYear){ 100 String day1 =null; 101 String month = null; 102 if (dayString<10){ 103 day1 = "0"+dayString; 104 }else { 105 day1 = dayString+""; 106 } 107 if (mSelMonth<10){ 108 month = "0"+mSelMonth; 109 }else { 110 month = mSelMonth+""; 111 } 112 time = mSelYear+"-"+month+"-"+day1; 113 String value = null; 114 if(valuesMap!=null) { 115 value = valuesMap.get(time); 116 } 117 if(dayString == mSelDay){ 118 mPaint.setColor(mSelectDayColor); 119 mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 120 canvas.drawCircle(cx, cy, 40, mPaint); 121 weekRow = row + 1; 122 }else if(value!=null&&value.equals("2")){//未签到日期为灰色圈 123 mPaint.setColor(mDayColor); 124 mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 125 canvas.drawCircle(cx, cy, 40, mPaint); 126 }else if (value!=null&&value.equals("3")){//外部签到日期为橙色圈 127 mPaint.setColor(mCurrentColor); 128 mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 129 canvas.drawCircle(cx, cy, 40, mPaint); 130 }else if (value!=null&&value.equals("1")){//内部签到日期为蓝色圈 131 mPaint.setColor(mSelectBGColor); 132 mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 133 canvas.drawCircle(cx, cy, 40, mPaint); 134 }else {//否则没有圈 135 136 } 137 } 138 mPaint.setColor(textColor); 139 mPaint.setStyle(Paint.Style.FILL); 140 canvas.drawText(dayString+"", startX, startY, mPaint); 141 if (sd!=null&&sd.length>=3){ 142 if (mSelYear==Integer.valueOf(sd[0])&&mSelMonth==Integer.valueOf(sd[1])&&(day+1)==Integer.valueOf(sd[2])){ 143 mPaint.setTextSize(10*mDisplayMetrics.scaledDensity); 144 mPaint.setColor(mTextColor); 145 int x = (int) (mPaint.measureText("开始")/2); 146 canvas.drawText("开始",startX-x,startY+40,mPaint); 147 mPaint.setTextSize(mDaySize*mDisplayMetrics.scaledDensity); 148 } 149 } 150 if (ed!=null&&ed.length>=3){ 151 if (mSelYear==Integer.valueOf(ed[0])&&mSelMonth==Integer.valueOf(ed[1])&&(day+1)==Integer.valueOf(ed[2])){ 152 mPaint.setTextSize(10*mDisplayMetrics.scaledDensity); 153 mPaint.setColor(mTextColor); 154 canvas.drawText("结束",startX-5,startY+40,mPaint); 155 mPaint.setTextSize(mDaySize*mDisplayMetrics.scaledDensity); 156 } 157 } 158 159 if(tv_date != null){ 160 tv_date.setText(mSelYear + "年" + (mSelMonth + 1) + "月"); 161 } 162 if(tv_week != null){ 163 tv_week.setText("第" + weekRow +"周"); 164 } 165 } 166 } 167 168 private void drawCircle(int row,int column,int day,Canvas canvas){ 169 if(daysHasThingList != null && daysHasThingList.size() >0){ 170 if(!daysHasThingList.contains(day))return; 171 mPaint.setColor(mCircleColor); 172 float circleX = (float) (mColumnSize * column + mColumnSize*0.8); 173 float circley = (float) (mRowSize * row + mRowSize*0.2); 174 canvas.drawCircle(circleX, circley, mCircleRadius, mPaint); 175 } 176 } 177 178 public DayOnClickLinser getLinser() { 179 return linser; 180 } 181 182 public void setLinser(DayOnClickLinser linser) { 183 this.linser = linser; 184 } 185 186 @Override 187 public boolean performClick() { 188 return super.performClick(); 189 } 190 191 private int downX = 0,downY = 0; 192 @Override 193 public boolean onTouchEvent(MotionEvent event) { 194 int eventCode= event.getAction(); 195 switch(eventCode){ 196 case MotionEvent.ACTION_DOWN: 197 downX = (int) event.getX(); 198 downY = (int) event.getY(); 199 break; 200 case MotionEvent.ACTION_MOVE: 201 break; 202 case MotionEvent.ACTION_UP: 203 int upX = (int) event.getX(); 204 int upY = (int) event.getY(); 205 if(Math.abs(upX-downX) < 10 && Math.abs(upY - downY) < 10){//点击事件 206 performClick(); 207 doClickAction((upX + downX)/2,(upY + downY)/2); 208 if (isCurrent()){ 209 linser.isDayClick(isCurrent()); 210 } 211 } 212 break; 213 } 214 return true; 215 } 216 217 /** 218 * 初始化列宽行高 219 */ 220 private void initSize(){ 221 mColumnSize = getWidth() / NUM_COLUMNS; 222 mRowSize = getHeight() / NUM_ROWS; 223 } 224 225 /** 226 * 设置年月 227 * @param year 228 * @param month 229 */ 230 public void setSelectYearMonth(int year,int month,int day){ 231 mSelYear = year; 232 mSelMonth = month; 233 mSelDay = day; 234 } 235 /** 236 * 执行点击事件 237 * @param x 238 * @param y 239 */ 240 private void doClickAction(int x,int y){ 241 int row = y / mRowSize; 242 int column = x / mColumnSize; 243 if (row<daysString.length&&column<daysString[row].length){ 244 setSelectYearMonth(mSelYear,mSelMonth,daysString[row][column]); 245 invalidate(); 246 //执行activity发送过来的点击处理事件 247 if(dateClick != null){ 248 dateClick.onClickOnDate(mSelYear,mSelMonth,mSelDay); 249 } 250 }else { 251 return; 252 } 253 254 } 255 256 /** 257 * 左点击,日历向后翻页 258 */ 259 public void onLeftClick(){ 260 int year = mSelYear; 261 int month = mSelMonth; 262 int day = mSelDay; 263 if(month == 1){//若果是1月份,则变成12月份 264 year = mSelYear-1; 265 month = 12; 266 }else if(DateUtil.get(year, month) == day){ 267 //如果当前日期为该月最后一点,当向前推的时候,就需要改变选中的日期 268 month = month-1; 269 day = DateUtil.getMonthDays(year, month); 270 }else{ 271 month = month-1; 272 } 273 setSelectYearMonth(year,month,day); 274 invalidate(); 275 } 276 277 /** 278 * 右点击,日历向前翻页 279 */ 280 public void onRightClick(){ 281 int year = mSelYear; 282 int month = mSelMonth; 283 int day = mSelDay; 284 if(month == 12){//若果是12月份,则变成1月份 285 year = mSelYear+1; 286 month = 1; 287 }else if(DateUtil.getMonthDays(year, month) == day){ 288 //如果当前日期为该月最后一天,当向前推的时候,就需要改变选中的日期 289 month = month + 1; 290 day = DateUtil.getMonthDays(year, month); 291 }else{ 292 month = month + 1; 293 } 294 setSelectYearMonth(year,month,day); 295 invalidate(); 296 } 297 298 public Boolean isCurrent(){ 299 boolean isc = false; 300 if (mCurrYear==mSelYear&&mCurrMonth==mSelMonth&&mCurrDay==mSelDay){ 301 isc=true; 302 }else { 303 isc=false; 304 } 305 return isc; 306 } 307 308 309 310 311 public void setStartDay(String startDay) { 312 sd = startDay.split("-"); 313 314 } 315 316 317 public void setEndDay(String endDay) { 318 ed = endDay.split("-"); 319 } 320 321 /** 322 * 获取选择的年份 323 * @return 324 */ 325 public int getmSelYear() { 326 return mSelYear; 327 } 328 /** 329 * 获取选择的月份 330 * @return 331 */ 332 public int getmSelMonth() { 333 return mSelMonth; 334 } 335 /** 336 * 获取选择的日期 337 * 338 */ 339 public int getmSelDay() { 340 return this.mSelDay; 341 } 342 /** 343 * 普通日期的字体颜色,默认黑色 344 * @param mDayColor 345 */ 346 public void setmDayColor(int mDayColor) { 347 this.mDayColor = mDayColor; 348 } 349 350 /** 351 * 选择日期的颜色,默认为白色 352 * @param mSelectDayColor 353 */ 354 public void setmSelectDayColor(int mSelectDayColor) { 355 this.mSelectDayColor = mSelectDayColor; 356 } 357 358 /** 359 * 选中日期的背景颜色,默认蓝色 360 * @param mSelectBGColor 361 */ 362 public void setmSelectBGColor(int mSelectBGColor) { 363 this.mSelectBGColor = mSelectBGColor; 364 } 365 /** 366 * 当前日期不是选中的颜色,默认红色 367 * @param mCurrentColor 368 */ 369 public void setmCurrentColor(int mCurrentColor) { 370 this.mCurrentColor = mCurrentColor; 371 } 372 373 /** 374 * 日期的大小,默认18sp 375 * @param mDaySize 376 */ 377 public void setmDaySize(int mDaySize) { 378 this.mDaySize = mDaySize; 379 } 380 381 public Map<String, String> getValuesMap() { 382 return valuesMap; 383 } 384 385 public void setValuesMap(Map<String, String> valuesMap) { 386 this.valuesMap = valuesMap; 387 } 388 389 /** 390 * 设置显示当前日期的控件 391 * @param tv_date 392 * 显示日期 393 * @param tv_week 394 * 显示周 395 */ 396 public void setTextView(TextView tv_date,TextView tv_week){ 397 this.tv_date = tv_date; 398 this.tv_week = tv_week; 399 invalidate(); 400 } 401 402 /** 403 * 设置事务天数 404 * @param daysHasThingList 405 */ 406 public void setDaysHasThingList(List<Integer> daysHasThingList) { 407 this.daysHasThingList = daysHasThingList; 408 } 409 410 /*** 411 * 设置圆圈的半径,默认为6 412 * @param mCircleRadius 413 */ 414 public void setmCircleRadius(int mCircleRadius) { 415 this.mCircleRadius = mCircleRadius; 416 } 417 418 /** 419 * 设置圆圈的半径 420 * @param mCircleColor 421 */ 422 public void setmCircleColor(int mCircleColor) { 423 this.mCircleColor = mCircleColor; 424 } 425 426 /** 427 * 设置日期的点击回调事件 428 * @author shiwei.deng 429 * 430 */ 431 public interface DateClick{ 432 public void onClickOnDate(int year,int month,int day); 433 } 434 435 /** 436 * 设置日期点击事件 437 * @param dateClick 438 */ 439 public void setDateClick(DateClick dateClick) { 440 this.dateClick = dateClick; 441 } 442 443 /** 444 * 跳转至今天 445 */ 446 public void setTodayToView(){ 447 setSelectYearMonth(mCurrYear,mCurrMonth,mCurrDay); 448 invalidate(); 449 } 450 451 /** 452 * 日历点击回掉接口 453 */ 454 public interface DayOnClickLinser { 455 void isDayClick(Boolean ok); 456 } 457 }
XML布局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <LinearLayout 8 android:layout_width="match_parent" 9 android:layout_height="250dp" 10 android:background="#ffffff" 11 android:orientation="horizontal"> 12 <RelativeLayout 13 android:id="@+id/layout_left" 14 android:layout_width="match_parent" 15 android:layout_height="match_parent" 16 android:layout_weight="7"> 17 <ImageView 18 android:layout_width="match_parent" 19 android:layout_height="20dp" 20 android:layout_gravity="center" 21 android:src="@mipmap/yueleft" 22 android:layout_centerInParent="true"/> 23 </RelativeLayout> 24 25 <LinearLayout 26 android:layout_width="match_parent" 27 android:layout_height="match_parent" 28 android:orientation="vertical" 29 android:layout_weight="1"> 30 <com.cgssafety.android.views.WeekDayView 31 android:layout_width="match_parent" 32 android:layout_height="30dp" /> 33 <com.cgssafety.android.views.MonthDateView 34 android:id="@+id/canlad_mysylfe" 35 android:layout_width="match_parent" 36 android:layout_height="match_parent" /> 37 </LinearLayout> 38 <RelativeLayout 39 android:id="@+id/layout_right" 40 android:layout_width="match_parent" 41 android:layout_height="match_parent" 42 android:layout_weight="7"> 43 <ImageView 44 android:layout_width="match_parent" 45 android:layout_height="20dp" 46 android:layout_gravity="center" 47 android:layout_centerInParent="true" 48 android:src="@mipmap/yueright"/> 49 </RelativeLayout> 50 51 </LinearLayout> 52 53 <RelativeLayout 54 android:id="@+id/layout_meiqian" 55 android:layout_width="match_parent" 56 android:layout_height="wrap_content" 57 android:background="@color/white" 58 android:padding="5dp"> 59 <TextView 60 android:id="@+id/tv_buqian_text" 61 android:layout_width="wrap_content" 62 android:layout_height="wrap_content" 63 android:text="请选择以下任意点签到" 64 android:layout_centerVertical="true" 65 android:textSize="14sp" 66 android:textColor="@color/text_10" 67 android:layout_marginLeft="15dp"/> 68 <TextView 69 android:id="@+id/tv_tijiao" 70 android:layout_width="60dp" 71 android:layout_height="25dp" 72 android:text="提交" 73 android:layout_alignParentRight="true" 74 android:gravity="center" 75 android:layout_marginRight="15dp" 76 android:background="@drawable/buttoncolors"/> 77 </RelativeLayout> 78 <LinearLayout 79 android:layout_width="match_parent" 80 android:layout_height="match_parent" 81 android:background="#f2f2f2"> 82 <ListView 83 android:id="@+id/lv_kaqin" 84 android:layout_width="match_parent" 85 android:layout_height="match_parent" 86 android:background="#f2f2f2" 87 android:layout_marginTop="10dp" 88 android:dividerHeight="10dp" 89 android:divider="@null" 90 > 91 </ListView> 92 </LinearLayout> 93 94 </LinearLayout>
在一个fragment中使用 CountentCalendFragment
1 public class CountentCalendFragment extends Fragment { 2 3 public static final int MODE_INTERNET = 1; 4 public static final int MODE_BENDI = 2; 5 public MonthDateView candle;//日历控件 6 private ListView listView;//地址列表 7 private UserManager manager;// 8 private List<KaoQinChelend> list;//子表数据 9 private List<KaoQinMain> list2;//主表数据 10 private AdderssAdapter adapter;//地址列表适配器 11 private RelativeLayout layout;//还未签到按钮 12 private TextView tv_buqian_text;//签到提示 13 private TextView tv_tijiao;//提交按钮 14 private String time ;//当前日历时间 15 private String currentime;//当天时间 16 private int mode;//本地或网络模式选择未用 17 private int list_flag = -1;//列表索引 18 private RelativeLayout layout_left; 19 private RelativeLayout layout_right; 20 private MachineCountentActivity preantActivity; 21 private MachineDataForInternet machineDataForInternet; 22 private String adderss; 23 // private String day; 24 private boolean isgin = false;//是否签到标志 25 private AlertDialog dialog;//弹框控件 26 27 @Nullable 28 @Override 29 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 View view = inflater.inflate(R.layout.fragment_calend_regiser,null); 31 initData(); 32 initview(view); 33 initOnClick(); 34 preantActivity = (MachineCountentActivity) getActivity(); 35 upData(time); 36 return view; 37 } 38 private void initData(){ 39 manager = UserManager.getUserManager(getContext()); 40 list = new ArrayList<>(); 41 list2 = new ArrayList<>(); 42 SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); 43 time = format1.format(new Date()); 44 currentime = format1.format(new Date()); 45 } 46 private void initview(View view){ 47 listView = (ListView) view.findViewById(R.id.lv_kaqin); 48 candle = (MonthDateView) view.findViewById(R.id.canlad_mysylfe); 49 candle.setTodayToView(); 50 layout = (RelativeLayout) view.findViewById(R.id.layout_meiqian); 51 layout_left = (RelativeLayout) view.findViewById(R.id.layout_left); 52 layout_right = (RelativeLayout) view.findViewById(R.id.layout_right); 53 tv_buqian_text = (TextView) view.findViewById(R.id.tv_buqian_text); 54 tv_tijiao = (TextView) view.findViewById(R.id.tv_tijiao); 55 candle.setStartDay(DateUtil.getStrTime(CgssafetyApp.xmdid.getRcdrq(),"yyyy-MM-dd")); 56 candle.setEndDay(DateUtil.getStrTime(CgssafetyApp.xmdid.getRsdrq(),"yyyy-MM-dd")); 57 } 58 59 private void initOnClick(){ 60 candle.setDateClick(new MonthDateView.DateClick() { 61 @Override 62 public void onClickOnDate(int year, int month, int day) { 63 String day1 = null; 64 String moth1 = null; 65 if (day<10){ 66 day1 = "0"+day; 67 }else{ 68 day1 = day+""; 69 } 70 if (month<10){ 71 moth1 = "0"+month; 72 }else { 73 moth1 = month+""; 74 } 75 time = year+"-"+moth1+"-"+day1; 76 if (mode==MODE_INTERNET){ 77 upDataInternet(time); 78 }else { 79 upData(time); 80 } 81 Log.e("tag", "onClickOnDate: "+list.toString() ); 82 } 83 }); 84 tv_tijiao.setOnClickListener(new View.OnClickListener() { 85 @Override 86 public void onClick(View v) { 87 if (list_flag!=-1){ 88 if (dialog == null) { 89 dialog = new AlertDialog.Builder(getContext()).setTitle("提示")//设置对话框标题 90 .setMessage("请确认签到")//设置显示的内容 91 .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加确定按钮 92 @Override 93 public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件 94 SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 95 String buqday = DateUtil.Calendar2Str(DateUtil.str2Calendar(list.get(list_flag).getDateId(),"yyyy-MM-dd"),"yyyy-MM-dd"); 96 int isbq = 0; 97 if (currentime.equals(buqday)){ 98 isbq = 0; 99 }else { 100 isbq = 1; 101 }104 } 105 }).setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加返回按钮 106 @Override 107 public void onClick(DialogInterface dialog, int which) {//响应事件 108 109 } 110 }).show();//在按键响应事件中显示此对话框 111 } else { 112 dialog.show(); 113 } 114 }else { 115 Toast.makeText(getContext(),"请选择签到地点",Toast.LENGTH_LONG).show(); 116 } 117 } 118 }); 119 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 120 @Override 121 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 122 list_flag = position; 123 adapter.notifyDataSetChanged(); 124 } 125 }); 126 layout_left.setOnClickListener(new View.OnClickListener() { 127 @Override 128 public void onClick(View v) { 129 preantActivity.OnClick_left(); 130 } 131 }); 132 layout_right.setOnClickListener(new View.OnClickListener() { 133 @Override 134 public void onClick(View v) { 135 preantActivity.OnClick_right(); 136 } 137 }); 138 candle.setLinser(new MonthDateView.DayOnClickLinser() { 139 @Override 140 public void isDayClick(Boolean ok) { 141 142 } 143 }); 144 } 145 146 public void setAdderss(String adderss) { 147 this.adderss = adderss; 148 } 149 150 public void setValuseMaoForCandle(Map<String,String> map){ 151 candle.setValuesMap(map); 152 } 153 154 public void clearListView(){ 155 if (list!=null&&adapter!=null){ 156 list.clear(); 157 adapter.notifyDataSetChanged(); 158 } 159 } 160 161 private void upData(String time){ 162 list = manager.selectTableSingSon(time); 163 list2 = manager.selectTableSignMomAboutTime(time); 164 String isok = null; 165 if (list2.size()>0){//当天有轨迹记录 166 isok = list2.get(0).getIsSign(); 167 layout.setVisibility(View.VISIBLE); 168 if (isok.equals("true")){//判断是否有签到记录 169 tv_tijiao.setBackgroundResource(R.drawable.btn_undble_colors); 170 tv_buqian_text.setTextColor(getResources().getColor(R.color.text_unable)); 171 tv_buqian_text.setText(time+"日已签到"); 172 tv_tijiao.setText("已签"); 173 tv_tijiao.setVisibility(View.VISIBLE); 174 isgin = true; 175 listView.setEnabled(false); 176 tv_tijiao.setClickable(false); 177 }else { 178 tv_buqian_text.setText("请选择以下任意点签到"); 179 tv_tijiao.setVisibility(View.VISIBLE); 180 } 181 }else{ 182 if (time.equals(currentime)){//传入时间是否为当前时间 183 tv_buqian_text.setText(time); 184 tv_tijiao.setText("签到"); 185 tv_tijiao.setBackgroundResource(R.drawable.buttoncolors); 186 tv_tijiao.setVisibility(View.VISIBLE); 187 isgin = false; 188 tv_buqian_text.setTextColor(getResources().getColor(R.color.text_10)); 189 listView.setEnabled(true); 190 tv_tijiao.setClickable(true); 191 }else { 192 tv_buqian_text.setText(time+"未查询到记录"); 193 tv_tijiao.setVisibility(View.GONE); 194 tv_buqian_text.setTextColor(getResources().getColor(R.color.text_unable)); 195 } 196 197 } 198 if (time.equals(currentime)){ 199 if (preantActivity.getMyLocation()!=null){ 200 KaoQinChelend qinChelend =new KaoQinChelend(); 201 qinChelend.setIsSelect("false"); 202 qinChelend.setAddress(preantActivity.getMyLocation().getAddrStr()); 203 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 204 String day = format.format(new Date()); 205 qinChelend.setDateId(day); 206 qinChelend.setLat(LatLogUtil.interceptionFive(preantActivity.getMyLocation().getLatitude())+""); 207 qinChelend.setLog(LatLogUtil.interceptionFive(preantActivity.getMyLocation().getLongitude())+""); 208 list.add(qinChelend); 209 } 210 } 211 Collections.reverse(list); 212 if (adapter==null){ 213 adapter = new AdderssAdapter(); 214 listView.setAdapter(adapter); 215 }else { 216 adapter.notifyDataSetChanged(); 217 } 218 } 219 220 221 public void upDataFormActivity(){ 222 upData(time); 223 } 224 225 public void upDataInternet(String day){ 226 list.clear(); 227 KaoQinInternetData.SignListBean bean =MachineDataForInternet.map2.get(day); 228 if (bean!=null){ 229 KaoQinChelend chelend = new KaoQinChelend(); 230 chelend.setLat(bean.getLat()); 231 chelend.setAddress(bean.getSignPlace()); 232 chelend.setLog(bean.getLongitude()); 233 chelend.setDateId(DateUtil.getStrTime(bean.getSignDate(),"yyyy-MM-dd HH:mm:ss")); 234 chelend.setIsSelect("false"); 235 list.add(chelend); 236 } 237 if (adapter==null){ 238 adapter = new AdderssAdapter(); 239 listView.setAdapter(adapter); 240 }else { 241 adapter.notifyDataSetChanged(); 242 } 243 } 244 public String getDate(){ 245 String str = null; 246 String day1 = null; 247 String moth = null; 248 int year = candle.getmSelYear(); 249 int month = candle.getmSelMonth(); 250 int day = candle.getmSelDay(); 251 if (day<10){ 252 day1 = "0"+day; 253 }else { 254 day1 = day+""; 255 } 256 if (month<10){ 257 moth = "0"+month; 258 }else { 259 moth = month+""; 260 } 261 str = year+"-"+moth+"-"+day1; 262 return str; 263 } 264 265 class AdderssAdapter extends BaseAdapter { 266 267 @Override 268 public int getCount() { 269 return list.size(); 270 } 271 272 @Override 273 public Object getItem(int position) { 274 return list.get(position); 275 } 276 277 @Override 278 public long getItemId(int position) { 279 return position; 280 } 281 282 @Override 283 public View getView(final int position, View convertView, ViewGroup parent) { 284 ViewHolder holder ; 285 if (convertView==null){ 286 convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_kaoqin_weizhi,null); 287 holder = new ViewHolder(convertView); 288 convertView.setTag(holder); 289 }else { 290 holder = (ViewHolder) convertView.getTag(); 291 } 292 holder.tv_address.setText(list.get(position).getAddress()); 293 holder.tv_time.setText(DateUtil.getStrTime(DateUtil.getTime(list.get(position).getDateId())+"","HH:mm")); 294 holder.tv_num.setText((position+1)+""); 295 holder.tv_log.setText("经度:"+list.get(position).getLog()); 296 holder.tv_lat.setText("纬度:"+list.get(position).getLat()); 297 if (isgin){ 298 if (list.get(position).getIsSelect().equals("true")){ 299 holder.iv_check.setImageResource(R.mipmap.xuanzhong); 300 }else { 301 holder.iv_check.setImageResource(R.mipmap.weixuna); 302 holder.iv_check.setVisibility(View.GONE); 303 } 304 }else { 305 if (position == list_flag){ 306 holder.iv_check.setImageResource(R.mipmap.xuanzhong); 307 }else { 308 holder.iv_check.setImageResource(R.mipmap.weixuna); 309 } 310 } 311 return convertView; 312 } 313 class ViewHolder { 314 TextView tv_time; 315 ImageView iv_check; 316 TextView tv_address; 317 TextView tv_num; 318 TextView tv_log; 319 TextView tv_lat; 320 public ViewHolder(View view) { 321 tv_time = (TextView) view.findViewById(R.id.tv_dang_temp); 322 iv_check = (ImageView) view.findViewById(R.id.iv_kaoqin_check_ok); 323 tv_address = (TextView) view.findViewById(R.id.kaoqin_ceurrent_address); 324 tv_num = (TextView) view.findViewById(R.id.tv_number); 325 tv_log = (TextView) view.findViewById(R.id.tv_log); 326 tv_lat = (TextView) view.findViewById(R.id.tv_lat); 327 } 328 } 329 } 330 331 }