前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现带签到赢积分功能的日历

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

作者头像
砸漏
发布2020-11-05 11:08:59
1.8K0
发布2020-11-05 11:08:59
举报
文章被收录于专栏:恩蓝脚本

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

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

代码语言:javascript
复制
<?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中的主要代码:

代码语言:javascript
复制
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("请检查网络是否连接"); 
} 
} 

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

代码语言:javascript
复制
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; 
} 
} 
代码语言:javascript
复制
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; 
} 
} 

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档