Android實(shí)現(xiàn)帶簽到贏積分功能的日歷
Android實(shí)現(xiàn)點(diǎn)擊簽到按鈕直接簽到,彈出dialog,先上效果圖

demo是利用gridview實(shí)現(xiàn)的,現(xiàn)附上布局文件
<?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="連續(xù)簽到會(huì)有更多積分哦 !" 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("請(qǐng)檢查網(wǎng)絡(luò)是否連接");
}
}
其計(jì)算日期的主要代碼在適配器中:
class MyCalendarAdapter extends BaseAdapter{
private boolean isLeapyear = false; // 是否為閏年
private int daysOfMonth = 0; // 某月的天數(shù)
private int dayOfWeek = 0; // 具體某一天是星期幾
private int lastDaysOfMonth = 0; // 上一個(gè)月的總天數(shù)
private Context context;
private String[] dayNumber = new String[42]; // 一個(gè)gridview中的日期存入此數(shù)組中
private SpecialCalendar sc = null;
private String currentYear = "";
private String currentMonth = "";
private int currentFlag = -1; // 用于標(biāo)記當(dāng)天
private String showYear = ""; // 用于在頭部顯示的年份
private String showMonth = ""; // 用于在頭部顯示的月份
private String animalsYear = "";
private String leapMonth = ""; // 閏哪一個(gè)月
// 系統(tǒng)當(dāng)前時(shí)間
private String sysDate = "";
private String sys_year = "";
private String sys_month = "";
private String sys_day = "";
private boolean flag;// 標(biāo)記是不是本月
private String[] data;
private int a;
public MyCalendarAdapter() {
Date date = new Date();
sysDate = sdf.format(date); // 當(dāng)期日期
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);// 得到當(dāng)前的年份
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) {
// 當(dāng)前月信息顯示
holder.tv_date.setTextColor(Color.parseColor("#2a2a2a"));// 當(dāng)月字體設(shè)黑
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) {
// 設(shè)置當(dāng)天的背景
// String dv="今日";
// SpannableString sp = new SpannableString(d + "\n" + dv);//當(dāng)天字體加粗
// 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;
}
// 得到某年的某月的天數(shù)且這月的第一天是星期幾
public void getCalendar(int year, int month) {
isLeapyear = sc.isLeapYear(year); // 是否為閏年
daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); // 某月的總天數(shù)
dayOfWeek = sc.getWeekdayOfMonth(year, month); // 某月第一天為星期幾
lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); // 上一個(gè)月的總天數(shù)
getweek(year, month);
}
// 將一個(gè)月中的每一天的值添加入數(shù)組dayNuber中
private void getweek(int year, int month) {
int j = 1;
int flag = 0;
String lunarDay = "";
// 得到當(dāng)前月的所有日程日期(這些日期需要標(biāo)記)
for (int i = 0; i < dayNumber.length; i++) {
if (i < dayOfWeek) { // 前一個(gè)月
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 + "";
// 對(duì)于當(dāng)前月才去標(biāo)記當(dāng)前日期
if (sys_year.equals(String.valueOf(year))
&& sys_month.equals(String.valueOf(month))
&& sys_day.equals(day)) {
// 標(biāo)記當(dāng)前日期
currentFlag = i;
}
setShowYear(String.valueOf(year));
setShowMonth(String.valueOf(month));
} else { // 下一個(gè)月
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; // 某月的天數(shù)
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;
}
// 得到某月有多少天數(shù)
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;
}
}
積分當(dāng)然是交給后臺(tái)處理返回了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)多線程斷點(diǎn)下載的方法
這篇文章主要介紹了Android實(shí)現(xiàn)多線程斷點(diǎn)下載的方法,可實(shí)現(xiàn)開(kāi)始、暫停下載及百分比進(jìn)度條等功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
kotlin實(shí)現(xiàn)快遞與號(hào)碼歸屬地查詢案例詳解
時(shí)間軸時(shí)一個(gè)很炫酷的效果,一般作用在物流信息上,我們同樣也可以作為一個(gè)學(xué)習(xí)對(duì)象去學(xué)習(xí)他的使用方法,同時(shí)呢,我們可以在線查詢我們的電話號(hào)碼歸屬地,巧用鍵盤的邏輯提升我們用戶體驗(yàn)2023-02-02
android中使用react-native設(shè)置應(yīng)用啟動(dòng)頁(yè)過(guò)程詳解
這篇文章主要介紹了android中使用react-native設(shè)置應(yīng)用啟動(dòng)頁(yè)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面效果
這篇文章主要介紹了Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面效果,需要的朋友可以參考下2017-05-05
Rxjava實(shí)現(xiàn)發(fā)送驗(yàn)證碼倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Rxjava實(shí)現(xiàn)發(fā)送驗(yàn)證碼倒計(jì)時(shí)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

