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

2020-11-05 11:08:59 浏览数 (1)

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

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

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

0 人点赞