Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android签到日历

Android实现带签到赢积分功能的日历

作者:疯狂的dialog

这篇文章主要为大家详细介绍了Android实现带签到赢积分功能的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android实现点击签到按钮直接签到,弹出dialog,先上效果图

demo是利用gridview实现的,现附上布局文件

<?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" 
 > 
 <LinearLayout 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:padding="2dp" 
 android:orientation="vertical" 
 android:background="@drawable/shape_btn_white" 
 > 
 <RelativeLayout 
 android:layout_width="match_parent" 
 android:layout_height="40dp" 
 > 
 <ImageView 
  android:id="@+id/iv_front" 
  android:layout_width="30dp" 
  android:layout_height="40dp" 
  android:padding="10dp" 
  android:layout_marginLeft="8dp" 
  android:scaleType="centerCrop" 
  android:layout_alignParentLeft="true" 
  android:layout_centerInParent="true" 
  android:src="@mipmap/icon_sign_front" 
  /> 
 <TextView 
  android:id="@+id/tv_date" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:layout_centerInParent="true" 
  android:textColor="#2fbbef" 
  android:textSize="15sp" 
  android:text="2016-7-16" 
  /> 
 <ImageView 
  android:id="@+id/iv_next" 
  android:layout_width="30dp" 
  android:layout_height="40dp" 
  android:layout_marginRight="8dp" 
  android:padding="10dp" 
  android:scaleType="centerCrop" 
  android:layout_alignParentRight="true" 
  android:layout_centerInParent="true" 
  android:src="@mipmap/icon_sign_next" 
  /> 
 </RelativeLayout> 
 <LinearLayout 
 android:layout_width="match_parent" 
 android:layout_height="40dp" 
 > 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="日" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="一" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="二" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="三" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="四" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="五" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 <TextView 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_weight="1" 
  android:gravity="center" 
  android:text="六" 
  android:textSize="15sp" 
  android:textColor="#888" 
  /> 
 </LinearLayout> 
 <GridView 
 android:id="@+id/gv_sign_date" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:background="#dbdbdb" 
 android:clickable="true" 
 android:clipChildren="true" 
 android:columnWidth="30dp" 
 android:listSelector="@null" 
 android:numColumns="7" 
 android:paddingBottom="1dp" 
 android:stretchMode="columnWidth" 
 android:verticalSpacing="1dp" 
 ></GridView> 
 <TextView 
  android:layout_width="match_parent" 
  android:layout_height="1dp" 
  android:background="#dbdbdb" 
  /> 
 <LinearLayout 
  android:layout_width="match_parent" 
  android:layout_height="50dp" 
  android:gravity="center" 
  > 
  <TextView 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:text="连续签到会有更多积分哦 !" 
  android:textColor="#2a2a2a" 
  android:layout_marginRight="5dp" 
  android:textSize="14sp" 
  /> 
  <TextView 
  android:id="@+id/tv_sign_num" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:layout_marginRight="20dp" 
  android:visibility="gone" 
  android:text="3天" 
  /> 
  <TextView 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:text="@string/jifen" 
  android:textColor="#2a2a2a" 
  android:visibility="gone" 
 
  android:layout_marginRight="5dp" 
  android:textSize="14sp" 
  /> 
  <TextView 
  android:id="@+id/tv_jifen_num" 
  android:visibility="gone" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:text="100" 
  /> 
 </LinearLayout> 
</LinearLayout> 
</LinearLayout> 

效果图: 


dialog中的主要代码:

public class SignDataDialog extends Dialog implements View.OnClickListener{ 
 private GridView gridView; 
 private ImageView iv_front,iv_next; 
 private TextView tv_date,tv_sign_days,tv_jifen; 
 private MyCalendarAdapter adapter; 
 private SpecialCalendar sp; 
 private Context context; 
 private SignDateModle modle; 
 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); 
 private String systime; 
 private int year,month; 
 String[] b=new String[]{ 
  "0","0","0","0","0","0","0", 
  "0","0","0","0","0","0","0", 
  "0","0","0","0","0","0","0", 
  "0","0","0","0","0","0","0", 
  "0","0","0","0","0","0","0", 
  "0","0","0","0","0","0","0" 
 }; 
 public SignDataDialog(Context context,SignDateModle modle) { 
 super(context); 
 this.context=context; 
 this.modle=modle; 
 setContentView(R.layout.dialog_sign_data); 
 Window window = getWindow(); 
 WindowManager.LayoutParams params = window.getAttributes(); 
 params.gravity = Gravity.CENTER; 
 window.setBackgroundDrawableResource(android.R.color.transparent); 
 window.setAttributes(params); 
 setCanceledOnTouchOutside(true); 
 } 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 sp=new SpecialCalendar(); 
 Date date = new Date(); 
 systime = sdf.format(date); 
 year=Integer.valueOf(systime.split("-")[0]); 
 month=Integer.valueOf(systime.split("-")[1]); 
 iv_front= (ImageView) findViewById(R.id.iv_front); 
 iv_next= (ImageView) findViewById(R.id.iv_next); 
 gridView= (GridView) findViewById(R.id.gv_sign_date); 
 tv_date= (TextView) findViewById(R.id.tv_date); 
 tv_sign_days= (TextView) findViewById(R.id.tv_sign_num); 
 tv_jifen= (TextView) findViewById(R.id.tv_jifen_num); 
 tv_date.setText(systime); 
 iv_front.setOnClickListener(this); 
 iv_next.setOnClickListener(this); 
 if (modle!=null) { 
  String dates=modle.getDateTime(); 
  adapter = new MyCalendarAdapter(context, Integer.valueOf(dates.split("-")[0]), Integer.valueOf(dates.split("-")[1]), 17, getStrings(modle)); 
  gridView.setAdapter(adapter); 
 } 
 } 
public String[] getStrings(SignDateModle modle){ 
 int year=Integer.valueOf(modle.getDateTime().split("-")[0]); 
 int moth=Integer.valueOf(modle.getDateTime().split("-")[1]); 
 int start=sp.getWeekdayOfMonth(year,moth); 
 for (int i=0;i<modle.getDatas().size();i++){ 
 if (modle.getDatas().get(i).getStatus()==1){ 
  b[i]=String.valueOf(1); 
 } 
 } 
 return b; 
} 
 @Override 
 public void onClick(View v) { 
 switch (v.getId()){ 
  case R.id.iv_front: 
  redMonth(); 
  tv_date.setText(year+"-"+month+"-"+systime.split("-")[2]); 
  changeOtherMoth(year, month); 
  break; 
  case R.id.iv_next: 
  addMonth(); 
  tv_date.setText(year+"-"+month+"-"+systime.split("-")[2]); 
  changeOtherMoth(year,month); 
  break; 
 } 
 } 
 public void addMonth(){ 
 month++; 
 if (month==13){ 
  month=1; 
  year++; 
 } 
 } 
 public void redMonth(){ 
 month--; 
 if (month==0){ 
  month=12; 
  year--; 
 } 
 } 
 public void changeOtherMoth(int year,int moth){ 
 if (CMethod.isNet(context)){ 
  JSONObject jsonObject= NetJsonModle.getJsonObject(context,"528"); 
  try { 
  jsonObject.put("reporterId",new LastLoginUtils(context).getReporterId()); 
  jsonObject.put("time", year + "-" + moth); 
  HttpUtils.PostDataToWeb(UrlAddressUrils.CODE_OTHER, AppConstants.SIGN_DATA_INFO, jsonObject, new HttpClientListener() { 
   @Override 
   public void onSuccess(String result) { 
   Gson gson = new Gson(); 
   SignDateModle m = gson.fromJson(result, SignDateModle.class); 
   for (int i = 0; i < b.length; i++) { 
    b[i] = "0"; 
   } 
   if (m != null) { 
    String dates = m.getDateTime(); 
    adapter = new MyCalendarAdapter(context, Integer.valueOf(dates.split("-")[0]), Integer.valueOf(dates.split("-")[1]), 17, getStrings(m)); 
    gridView.setAdapter(adapter); 
   } 
   } 
 
   @Override 
   public void onFailure(String result) { 
 
   } 
 
   @Override 
   public void onError() { 
 
   } 
  }); 
  } catch (JSONException e) { 
  e.printStackTrace(); 
  } 
 }else { 
  T.s("请检查网络是否连接"); 
 } 
 } 

其计算日期的主要代码在适配器中:

 class MyCalendarAdapter extends BaseAdapter{ 
 private boolean isLeapyear = false; // 是否为闰年 
 private int daysOfMonth = 0; // 某月的天数 
 private int dayOfWeek = 0; // 具体某一天是星期几 
 private int lastDaysOfMonth = 0; // 上一个月的总天数 
 private Context context; 
 private String[] dayNumber = new String[42]; // 一个gridview中的日期存入此数组中 
 private SpecialCalendar sc = null; 
 private String currentYear = ""; 
 private String currentMonth = ""; 
 private int currentFlag = -1; // 用于标记当天 
 private String showYear = ""; // 用于在头部显示的年份 
 private String showMonth = ""; // 用于在头部显示的月份 
 private String animalsYear = ""; 
 private String leapMonth = ""; // 闰哪一个月 
 // 系统当前时间 
 private String sysDate = ""; 
 private String sys_year = ""; 
 private String sys_month = ""; 
 private String sys_day = ""; 
 private boolean flag;// 标记是不是本月 
 private String[] data; 
 private int a; 
 public MyCalendarAdapter() { 
  Date date = new Date(); 
  sysDate = sdf.format(date); // 当期日期 
  sys_year = sysDate.split("-")[0]; 
  sys_month = sysDate.split("-")[1]; 
  sys_day = sysDate.split("-")[2]; 
 
 } 
 public MyCalendarAdapter(Context context,int year_c,int month_c, int day_c, String[] a) { 
  // TODO Auto-generated constructor stub 
  this(); 
  this.context = context; 
  sc = new SpecialCalendar(); 
  currentYear = String.valueOf(year_c);// 得到当前的年份 
  currentMonth = String.valueOf(month_c); 
  getCalendar(Integer.parseInt(currentYear), 
   Integer.parseInt(currentMonth)); 
  data = a; 
 } 
 @Override 
 public int getCount() { 
  return dayNumber.length; 
 } 
 
 @Override 
 public Object getItem(int position) { 
  return position; 
 } 
 
 @Override 
 public long getItemId(int position) { 
  return position; 
 } 
 
 @Override 
 public View getView(int position, View convertView, ViewGroup parent) { 
  ViewHolder holder; 
  if (convertView==null){ 
  holder=new ViewHolder(); 
  convertView= LayoutInflater.from(context).inflate(R.layout.item_sign_data,null); 
  holder.iv_bg= (ImageView) convertView.findViewById(R.id.iv_bg); 
  holder.tv_date= (TextView) convertView.findViewById(R.id.tv_date); 
  convertView.setTag(holder); 
  }else { 
  holder= (ViewHolder) convertView.getTag(); 
  } 
  String d = dayNumber[position]; 
  holder.tv_date.setText(d); 
  holder.tv_date.setTextColor(Color.GRAY); 
 
  if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) { 
  // 当前月信息显示 
  holder.tv_date.setTextColor(Color.parseColor("#2a2a2a"));// 当月字体设黑 
  flag = true; 
  a++; 
  } else { 
  flag = false; 
  } 
  if (flag) { 
  if (a <= data.length) { 
   String att = data[a - 1]; 
   if (att.equals("1")) {//签到 
    holder.tv_date.setTextColor(Color.parseColor("#2a2a2a")); 
    holder.iv_bg.setVisibility(View.VISIBLE); 
   } 
  } 
  } 
  if (currentFlag == position) { 
  // 设置当天的背景 
//  String dv="今日"; 
//  SpannableString sp = new SpannableString(d + "\n" + dv);//当天字体加粗 
//  sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, 
//   d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//  sp.setSpan(new RelativeSizeSpan(1.2f), 0, d.length(), 
//   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//  sp.setSpan(new RelativeSizeSpan(0.75f), d.length() , 
//   dayNumber[position].length()+ 3, 
//   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//  holder.tv_date.setText(sp); 
//  holder.iv_bg.setVisibility(View.VISIBLE); 
  holder.iv_bg.setImageDrawable(context.getResources().getDrawable(R.mipmap.icon_sign_bg_today)); 
  } 
  return convertView; 
 } 
 class ViewHolder{ 
  private ImageView iv_bg; 
  private TextView tv_date; 
 } 
 // 得到某年的某月的天数且这月的第一天是星期几 
 public void getCalendar(int year, int month) { 
  isLeapyear = sc.isLeapYear(year); // 是否为闰年 
  daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); // 某月的总天数 
  dayOfWeek = sc.getWeekdayOfMonth(year, month); // 某月第一天为星期几 
  lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); // 上一个月的总天数 
  getweek(year, month); 
 } 
 // 将一个月中的每一天的值添加入数组dayNuber中 
 private void getweek(int year, int month) { 
  int j = 1; 
  int flag = 0; 
  String lunarDay = ""; 
 
  // 得到当前月的所有日程日期(这些日期需要标记) 
  for (int i = 0; i < dayNumber.length; i++) { 
 
  if (i < dayOfWeek) { // 前一个月 
   int temp = lastDaysOfMonth - dayOfWeek + 1; 
   dayNumber[i] = (temp + i) + ""; 
  } else if (i < daysOfMonth + dayOfWeek) { // 本月 
   String day = String.valueOf(i - dayOfWeek + 1); // 得到的日期 
   dayNumber[i] = i - dayOfWeek + 1 + ""; 
   // 对于当前月才去标记当前日期 
   if (sys_year.equals(String.valueOf(year)) 
    && sys_month.equals(String.valueOf(month)) 
    && sys_day.equals(day)) { 
   // 标记当前日期 
   currentFlag = i; 
   } 
   setShowYear(String.valueOf(year)); 
   setShowMonth(String.valueOf(month)); 
  } else { // 下一个月 
   dayNumber[i] = j + ""; 
   j++; 
  } 
  } 
  String abc = ""; 
  for (int i = 0; i < dayNumber.length; i++) { 
  abc = abc + dayNumber[i] + ":"; 
  } 
 } 
 
 public String getShowYear() { 
  return showYear; 
 } 
 
 public void setShowYear(String showYear) { 
  this.showYear = showYear; 
 } 
 
 public String getShowMonth() { 
  return showMonth; 
 } 
 
 public void setShowMonth(String showMonth) { 
  this.showMonth = showMonth; 
 } 
 
 public String getAnimalsYear() { 
  return animalsYear; 
 } 
 
 public void setAnimalsYear(String animalsYear) { 
  this.animalsYear = animalsYear; 
 } 
 
 public String getLeapMonth() { 
  return leapMonth; 
 } 
 
 public void setLeapMonth(String leapMonth) { 
  this.leapMonth = leapMonth; 
 } 
} 
public class SpecialCalendar { 
 
 private int daysOfMonth = 0; // 某月的天数 
 private int dayOfWeek = 0; // 具体某一天是星期几 
 
 // 判断是否为闰年 
 public boolean isLeapYear(int year) { 
 if (year % 100 == 0 && year % 400 == 0) { 
  return true; 
 } else if (year % 100 != 0 && year % 4 == 0) { 
  return true; 
 } 
 return false; 
 } 
 
 // 得到某月有多少天数 
 public int getDaysOfMonth(boolean isLeapyear, int month) { 
 switch (month) { 
 case 1: 
 case 3: 
 case 5: 
 case 7: 
 case 8: 
 case 10: 
 case 12: 
  daysOfMonth = 31; 
  break; 
 case 4: 
 case 6: 
 case 9: 
 case 11: 
  daysOfMonth = 30; 
  break; 
 case 2: 
  if (isLeapyear) { 
  daysOfMonth = 29; 
  } else { 
  daysOfMonth = 28; 
  } 
 
 } 
 return daysOfMonth; 
 } 
 
 // 指定某年中的某月的第一天是星期几 
 public int getWeekdayOfMonth(int year, int month) { 
 Calendar cal = Calendar.getInstance(); 
 cal.set(year, month - 1, 1); 
 dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1; 
 return dayOfWeek; 
 } 
 
} 

积分当然是交给后台处理返回了。

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

您可能感兴趣的文章:
阅读全文