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;

}

}

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

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

以上是 Android实现带签到赢积分功能的日历 的全部内容, 来源链接: utcz.com/p/240565.html

回到顶部