首页 > 系统 > Android > 正文

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

2019-10-22 18:10:42
字体:
来源:转载
供稿:网友

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

Android,签到,日历

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> 

效果图: 

Android,签到,日历

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;  }  } 

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

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表