Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義組件之日歷控件-精美日歷實現(內容、樣式可擴展)

Android自定義組件之日歷控件-精美日歷實現(內容、樣式可擴展)

編輯:關於Android編程

需求
我們知道,Android系統本身有自帶的日歷控件,網絡上也有很多開源的日歷控件資源,但是這些日歷控件往往樣式較單一,API較多,不易於在實際項目中擴展並實現出符合具體樣式風格的,內容可定制的效果。本文通過自定義日歷控件,實現了在內容和樣式上可高度擴展的精美日歷demo,有需要的Android應用開發人員可迅速移植並按需擴展實現。

在某個應用中,需要查詢用戶的歷史考勤記錄,根據實際考勤數據在日歷中標記出不同的狀態(如正常出勤、請假、遲到等),並在頁面中顯示相應的說明文字。

效果
實現的效果如下
正常出勤


請假


遲到


正常出勤vcnP1LTC67XY1rejumh0dHA6Ly9kb3dubG9hZC5jc2RuLm5ldC9kZXRhaWwvZGFpamluODg4ODg4LzkwMjA1MzU8YnIgLz4NCqOo1rG907W8yOtFY2xpcHNlIEFEVLy0v8mjrLP2z9bC0sLrx+u199X7z+7Ev7HgwuujrLHK1d+1xMrHVVRGLTix4MLro6k8L3A+DQo8cD48c3Ryb25nPsq1z9a3vcq9PC9zdHJvbmc+PGJyIC8+DQrK18/Iy7XD98nmvLC1xNb30qrWqsq2teOjujxiciAvPg0KLSBHcmlkVmlldytBZGFwdGVyPGJyIC8+DQotIMjVwPrL47eoPC9wPg0KPHA+z+7Ev73hubnNvMjnz8KjujxiciAvPg0KPGltZyBhbHQ9"項目結構圖" src="/uploadfile/Collfiles/20150819/20150819083533121.png" title="\" />
com.widget.mycalendar 包下是主要的實現部分:

CalendarGridView.java: 自定義日歷GridView,此處可擴展樣式,可實現日歷中每個網格(對應某一天)的長按效果。 CalendarGridViewAdapter.java: 日歷適配器,對具體的網格賦值和選擇性控制樣式(實現多樣化)。 CalendarTool.java: 獲取日歷數據工具類,主要工具類,實現日歷算法,包括閏年判斷。 DateEntity.java: 日歷實體類,添加的參數在獲取日歷實體集合的時候設置,可以控制日期屬性(比如某一天對應的年、月、日、星期、是否為當前日期、是否為本月日期)

首先看自定義日歷GridView,
CalendarGridView.java:自定義日歷GridView,此處可擴展樣式,可實現日歷中每個網格(對應某一天)的長按效果。

package com.widget.mycalendar;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;

/**
 * @author daij
 * @version 1.0 自定義日歷GridView
 */
public class CalendarGridView extends GridView implements
        android.widget.AdapterView.OnItemLongClickListener {

    private Context mContext;

    public CalendarGridView(Context context) {
        super(context);
        this.mContext = context;
        initGridView();
    }

    public CalendarGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        initGridView();
    }

    public CalendarGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.mContext = context;
        initGridView();
    }

    /**
     * 初始化GirdView
     * 
     * @param <參數名稱>
     *            <參數類型> <參數說明>
     * @return <返回值類型>
     * @throws <異常>
     */
    public void initGridView() {

    }

    @Override
    public boolean onItemLongClick(AdapterView parent, View view,
            int position, long id) {
        return false;
    }

}

CalendarGridViewAdapter.java:日歷適配器,這裡提供的是模擬數據,根據不同日期的屬性控制不同顯示,對具體的網格賦值和選擇性控制樣式(實現多樣化)。

package com.widget.mycalendar;

import java.util.List;

import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.mycalendar.R;

/**
 * @author daij
 * @version 1.0 日歷適配器
 */
public class CalendarGridViewAdapter extends BaseAdapter {

    private Resources mRes;
    /** 上下文 */
    private Context mContext;
    /** 日期實體集合 */
    private List mDataList;
    /** 因為position是從0開始的,所以用當做一個中間者,用來加1.以達到判斷除數時,為哪個星期 */
    private int temp;

    public CalendarGridViewAdapter(Context context, Resources res) {
        this.mContext = context;
        this.mRes = res;
    }

    /** 設置日期數據 */
    public void setDateList(List dataList) {
        this.mDataList = dataList;
    }

    @Override
    public int getCount() {
        if (mDataList == null) {
            return 0;
        }
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 通過傳遞過來的MenuItem值給每一個item設置數據
        LinearLayout layout = (LinearLayout) LayoutInflater.from(mContext)
                .inflate(R.layout.calendar_item_layout, null);
        TextView textView = (TextView) layout
                .findViewById(R.id.calendar_item_tv_day);
        TextView tv_tip = (TextView) layout.findViewById(R.id.calendar_tip);
        if (mDataList != null) {
            textView.setText(mDataList.get(position).day + );
            if ((TextUtils.equals(CalendarTool.SATURDAY,
                    mDataList.get(position).weekDay))
                    || TextUtils.equals(CalendarTool.SUNDAY,
                            mDataList.get(position).weekDay)) {
                // 周末背景為白,字體為灰色
                textView.setBackgroundColor(mRes.getColor(R.color.white));
                textView.setTextColor(mRes.getColor(R.color.weekend_day_txt));
            }// TODO 在非周末時候設置顏色
            else {
                if (((mDataList.get(position).year == 2015 && mDataList
                        .get(position).month <= 8) || (mDataList.get(position).year < 2015 && mDataList
                        .get(position).month <= 12))
                        && mDataList.get(position).isSelfMonthDate) {// 2015.8以前,且日期在當月
                    if (mDataList.get(position).day > 0
                            && mDataList.get(position).day <= 20
                            || mDataList.get(position).day == 25) {
                        tv_tip.setBackgroundColor(mRes
                                .getColor(R.color.tip_normal));
                    } else if (mDataList.get(position).day == 21
                            || mDataList.get(position).day == 22) {
                        tv_tip.setBackgroundColor(mRes
                                .getColor(R.color.tip_leave));
                    } else if (mDataList.get(position).day == 23
                            || mDataList.get(position).day == 24) {
                        tv_tip.setBackgroundColor(mRes
                                .getColor(R.color.tip_late));
                    } else {
                        tv_tip.setBackgroundColor(mRes
                                .getColor(R.color.tip_normal));
                        if (mDataList.get(position).month == 8
                                && mDataList.get(position).day >= 25) {
                            tv_tip.setBackgroundColor(mRes
                                    .getColor(R.color.white));
                        }
                    }
                }
            }
            if (mDataList.get(position).isNowDate
                    && mDataList.get(position).isSelfMonthDate) {
                // 如果為當前號數,則設置為白色背景並,字體為藍色
                textView.setBackgroundColor(mRes.getColor(R.color.white));
                textView.setTextColor(mRes.getColor(R.color.current_day_txt));
            }
            if (!mDataList.get(position).isSelfMonthDate) {// 是否為本月的號數,不是本月號數顯示白色,及不顯示
                textView.setTextColor(mRes.getColor(R.color.white));
            }
            layout.setTag(mDataList.get(position));// 把當前日歷實體放入GridView 的Item中
        }

        return layout;
    }
}

CalendarTool.java: 獲取日歷數據工具類,實現日歷算法,包括閏年判斷,配有詳細注釋可參考

package com.widget.mycalendar;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.Context;
import android.graphics.Point;
import android.util.Log;

/**
 * @author daij
 * @version 1.0 獲取日歷數據工具類
 */
public class CalendarTool {
    public static final String MONDAY = 周一;
    public static final String TUESDAY = 周二;
    public static final String WEDNESDAY = 周三;
    public static final String THURSDAY = 周四;
    public static final String FRIDAY = 周五;
    public static final String SATURDAY = 周六;
    public static final String SUNDAY = 周日;
    public static final String[] weekDayRow = { SUNDAY, MONDAY, TUESDAY,
            WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };

    private List mDataList = new ArrayList();
    private DateEntity mDateEntity;
    private int mYear;
    private int mMonth;
    private int mDay;
    private int mDays;

    /** 系統當前年月日 */
    private int mCurrenYear;
    private int mCurrenMonth;
    private int mCurrenDay;
    private Context mContext;
    /** 用於算法的變量 */
    /** 已過去的年份總天數 */
    int mGoneYearDays = 0;
    /** 本年包括今天的過去天數 */
    int thisYearDays = 0;
    /** 是否為閏年 */
    boolean isLeapYear = false;
    /** 平年月天數數組 */
    int commonYearMonthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    /** 閏年月天數數組 */
    int leapYearMonthDay[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    public CalendarTool(Context context) {
        this.mContext = context;
        initNowDate();
    }

    /** 獲取當前日歷的年月 x為年,y為月 */
    public Point getNowCalendar() {
        Point p = new Point(mYear, mMonth);
        return p;
    }

    /** 通過年月獲取日期實體集合 集合大小為7*6=42,星期為7,6行以顯示足夠數量日期 */
    public List getDateEntityList(int year, int month) {
        mDataList.clear();
        int dayOfNowCalendar = 42;// 當前日歷板的日期總數 7*6個數
        int dayOfWeek = 0;// 得到當前年月的每一天為星期幾
        int selfDaysEndWeek = 0;// 本月的最後一天是星期幾
        int startDate = 0;// 當前月的上一個月在本日歷的開始日期
        int days = 0;// 得到本月的總共天數
        /** 修改部分 */
        int endDate = 0;// 得到上一個月的天數,作為上一個月在本日歷的結束日期
        if ((year - 1) == this.mYear || month == 1) {// 說明向前翻了一年,那麼上個月的天數就應該是上一年的12月的天數,或者到翻到一月份的時候,那麼上一個月的天數也是上一年的12月份的天數
            endDate = this.getDays(year - 1, 12);
        } else {// 得到上一個月的天數,作為上一個月在本日歷的結束日期
            endDate = this.getDays(year, month - 1);
        }
        /** 修改部分結束 */
        this.mYear = year;// 當前日歷上顯示的年
        this.mMonth = month;// 當前日歷上顯示的月
        int previoursMonthDays = 0;// 上一個月在本月顯示的天數
        int nextMonthDays = 0;// 下一個月在本月顯示的天數
        days = this.getDays(year, month);
        dayOfWeek = this.getWeekDay(year, month);
        if (dayOfWeek == 0) {
            startDate = endDate - 7 + 1;
        } else {
            startDate = endDate - dayOfWeek + 1;
        }
        previoursMonthDays = endDate - startDate + 1;
        nextMonthDays = dayOfNowCalendar - days - previoursMonthDays;
        /** 先添加前面不屬於本月的 */
        for (int i = startDate, j = 0; i <= endDate; i++, j++) {
            mDateEntity = new DateEntity();
            mDateEntity.day = i;
            mDateEntity.isSelfMonthDate = false;
            mDateEntity.year = year;
            mDateEntity.month = month - 1;
            mDateEntity.weekDay = weekDayRow[j];
            mDataList.add(mDateEntity);
        }
        /** 添加本月的 */
        for (int i = 1, j = dayOfWeek; i <= days; i++, j++) {
            mDateEntity = new DateEntity();
            mDateEntity.day = i;
            mDateEntity.isSelfMonthDate = true;
            mDateEntity.year = year;
            mDateEntity.month = month;
            if (j >= 7) {
                j = 0;
            }
            selfDaysEndWeek = j;
            mDateEntity.weekDay = weekDayRow[j];
            if ((year == mCurrenYear) && (month == mCurrenMonth)
                    && i == mCurrenDay) {
                mDateEntity.isNowDate = true;
            }
            mDataList.add(mDateEntity);
        }
        /*** 添加後面下一個月的 */
        for (int i = 1, j = selfDaysEndWeek + 1; i <= nextMonthDays; i++, j++) {
            mDateEntity = new DateEntity();
            mDateEntity.day = i;
            mDateEntity.isSelfMonthDate = false;
            mDateEntity.year = year;
            mDateEntity.month = month + 1;
            if (j >= 7) {
                j = 0;
            }
            mDateEntity.weekDay = weekDayRow[j];
            mDataList.add(mDateEntity);
        }
        return mDataList;
    }

    /** 通過年月,獲取這個月一共有多少天 */
    public int getDays(int year, int month) {
        int days = 0;

        if ((year % 4 == 0 && (year % 100 != 0)) || (year % 400 == 0)) {
            if (month > 0 && month <= 12) {
                days = leapYearMonthDay[month - 1];
            }
        } else {
            if (month > 0 && month <= 12) {
                days = commonYearMonthDay[month - 1];
            }
        }
        return days;
    }

    /** 獲取星期的排列 */
    public String[] getWeekDayRow() {
        return weekDayRow;
    }

    /** 初始化當前系統的日期 */
    public void initNowDate() {
        Date date = new Date();
        SimpleDateFormat simpleFormat = new SimpleDateFormat(yyyy-M-d);
        String currentDate = simpleFormat.format(date); // 當期日期
        mCurrenYear = Integer.parseInt(currentDate.split(-)[0]);
        mCurrenMonth = Integer.parseInt(currentDate.split(-)[1]);
        mCurrenDay = Integer.parseInt(currentDate.split(-)[2]);
        this.mYear = mCurrenYear;
        this.mMonth = mCurrenMonth;
    }

    /** 通過年,月獲取當前月的第一天1日為星期幾 ,返回0是星期天,1是星期一,依次類推 */
    public int getWeekDay(int year, int month) {
        int dayOfWeek;
        int goneYearDays = 0;
        int thisYearDays = 0;
        boolean isLeapYear = false;
        int commonYearMonthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
                30, 31 };
        int leapYearMonthDay[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30,
                31 };
        for (int i = 1900; i < year; i++) {// 從1900年開始算起,1900年1月1日為星期一
            if ((i % 4 == 0 && (i % 100 != 0)) || (i % 400 == 0)) {
                goneYearDays = goneYearDays + 366;
            } else {
                goneYearDays = goneYearDays + 365;
            }
        }
        if ((year % 4 == 0 && (year % 100 != 0)) || (year % 400 == 0)) {
            isLeapYear = true;
            for (int i = 0; i < month - 1; i++) {
                thisYearDays = thisYearDays + leapYearMonthDay[i];
            }
        } else {
            isLeapYear = false;
            for (int i = 0; i < month - 1; i++) {
                thisYearDays = thisYearDays + commonYearMonthDay[i];
            }
        }
        dayOfWeek = (goneYearDays + thisYearDays + 1) % 7;
        Log.d(this.getClass().getName(), 從1990到現在有
                + (goneYearDays + thisYearDays + 1) + 天);
        Log.d(this.getClass().getName(), year + 年 + month + 月 + 1 + 日是星期
                + dayOfWeek);
        return dayOfWeek;
    }
}

DateEntity.java:實體類,比較簡單

package com.widget.mycalendar;

import java.io.Serializable;

/**
 * @author daij
 * @version 1.0 日歷實體類,添加的參數在獲取日歷實體集合的時候設置
 */
public class DateEntity implements Serializable {

    private static final long serialVersionUID = -6053739977785155088L;
    /** 年 */
    public int year;
    /** 月 */
    public int month;
    /** 日 */
    public int day;
    /** 星期 */
    public String weekDay;
    /** 是否為當前日期 */
    public boolean isNowDate;
    /** 是否為本月日期 */
    public boolean isSelfMonthDate;
}

MainActivity.java:主Activity,用於提供模擬數據和實現交互,代碼如下:

package com.example.mycalendar;

import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.TextView;

import com.widget.mycalendar.CalendarGridView;
import com.widget.mycalendar.CalendarGridViewAdapter;
import com.widget.mycalendar.CalendarTool;
import com.widget.mycalendar.DateEntity;

/**
 * @author daij
 * @version 1.0 日歷:考勤記錄
 */
public class MainActivity extends Activity {
    private CalendarGridViewAdapter mAdapter;
    private CalendarTool mCalendarTool;
    private CalendarGridView mGridView;
    private List mDateEntityList;
    private Point mNowCalendarPoint;
    private ImageView mPrevioursIv;
    private ImageView mNextIv;
    private ImageView ivBack;
    private TextView mCalendarTv;
    private TextView tvDetail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        super.onCreate(savedInstanceState);

        initView();// 初始化View
        setListeners();
        // requestXmas();//請求數據
    }

    /** 初始化view */
    public void initView() {
        mPrevioursIv = (ImageView) findViewById(R.id.calendar_bar_iv_previours);
        mNextIv = (ImageView) findViewById(R.id.calendar_bar_iv_next);
        ivBack = (ImageView) findViewById(R.id.iv_back);
        mCalendarTv = (TextView) findViewById(R.id.calendar_bar_tv_date);
        tvDetail = (TextView) findViewById(R.id.tv_detail);

        mGridView = (CalendarGridView) findViewById(R.id.calendar_gridview);
        mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
        mGridView.setOnItemClickListener(new CalendarItemClickListener());

        mPrevioursIv.setOnClickListener(new ImageViewClickListener());
        mNextIv.setOnClickListener(new ImageViewClickListener());
        mCalendarTool = new CalendarTool(this);
        mNowCalendarPoint = mCalendarTool.getNowCalendar();
        mCalendarTv.setText(mNowCalendarPoint.x + 年 + mNowCalendarPoint.y
                + 月);
        mDateEntityList = mCalendarTool.getDateEntityList(mNowCalendarPoint.x,
                mNowCalendarPoint.y);
        mAdapter = new CalendarGridViewAdapter(this, getResources());
        mAdapter.setDateList(mDateEntityList);
        mGridView.setAdapter(mAdapter);
    }

    /** 日歷監聽類 */
    class CalendarItemClickListener implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterView parent, View view, int position,
                long id) {
            // TODO 模擬數據
            DateEntity itemDate = (DateEntity) view.getTag();

            if (!((TextUtils.equals(CalendarTool.SATURDAY, itemDate.weekDay)) || TextUtils
                    .equals(CalendarTool.SUNDAY, itemDate.weekDay))) {// 非周末
                if (((itemDate.year == 2015 && itemDate.month <= 8) || (itemDate.year < 2015 && itemDate.month <= 12))
                        && itemDate.isSelfMonthDate) {// 2015.8以前,且日期在當月
                    if (itemDate.day > 0 && itemDate.day <= 20
                            || itemDate.day == 25) {// 正常出勤
                        tvDetail.setText(備注: + 
 +         
                                + itemDate.year + 年 + itemDate.month + 月
                                + itemDate.day + 日 + -- + itemDate.weekDay
                                + 
 + 正常出勤。);
                    } else if (itemDate.day == 21 || itemDate.day == 22) {// 請假
                        tvDetail.setText(備注: + 
 +         
                                + itemDate.year + 年 + itemDate.month + 月
                                + itemDate.day + 日 + -- + itemDate.weekDay
                                + 
 + 請假兩天,從 + itemDate.month + 月21日到
                                + itemDate.month + 月22日);
                    } else if (itemDate.day == 23 || itemDate.day == 24) {// 遲到、早退
                        if (itemDate.day == 23) {

                            tvDetail.setText(備注: + 
 +         
                                    + itemDate.year + 年 + itemDate.month
                                    + 月 + itemDate.day + 日 + --
                                    + itemDate.weekDay + 

                                    + 上午8:36打卡,下午5:40打卡 + 
 + 上午遲到6分鐘);
                        } else if (itemDate.day == 24) {

                            tvDetail.setText(備注: + 
 +         
                                    + itemDate.year + 年 + itemDate.month
                                    + 月 + itemDate.day + 日 + --
                                    + itemDate.weekDay + 

                                    + 上午8:25打卡,下午5:29打卡 + 
 + 下午早退1分鐘);
                        }
                    } else {
                        if (itemDate.month == 8 && itemDate.day > 25) {
                            return;
                        }
                        tvDetail.setText(備注: + 
 +         
                                + itemDate.year + 年 + itemDate.month + 月
                                + itemDate.day + 日 + -- + itemDate.weekDay
                                + 
 + 正常出勤。);
                    }
                }
            }

            // Toast.makeText(
            // RecordCalendar.this,
            // 選中的是 + itemDate.year + 年 + itemDate.month + 月
            // + itemDate.day + 日 + -- + itemDate.weekDay,
            // Toast.LENGTH_SHORT).show();
        }
    }

    /** 按鈕 */
    class ImageViewClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.calendar_bar_iv_previours:// 上月
                mDateEntityList.clear();
                mNowCalendarPoint = mCalendarTool.getNowCalendar();
                if (mNowCalendarPoint.x >= 1990 && mNowCalendarPoint.x < 2038) {
                    if (mNowCalendarPoint.y - 1 <= 0) {
                        mDateEntityList = mCalendarTool.getDateEntityList(
                                mNowCalendarPoint.x - 1, 12);
                    } else {
                        mDateEntityList = mCalendarTool.getDateEntityList(
                                mNowCalendarPoint.x, mNowCalendarPoint.y - 1);
                    }

                    mAdapter.setDateList(mDateEntityList);
                    mAdapter.notifyDataSetChanged();
                    mNowCalendarPoint = mCalendarTool.getNowCalendar();
                    mCalendarTv.setText(mNowCalendarPoint.x + 年
                            + mNowCalendarPoint.y + 月);
                }

                break;
            case R.id.calendar_bar_iv_next:// 下月
                mNowCalendarPoint = mCalendarTool.getNowCalendar();
                mDateEntityList.clear();
                if (mNowCalendarPoint.x >= 1990 && mNowCalendarPoint.x < 2038) {
                    if (mNowCalendarPoint.y + 1 > 12) {
                        mDateEntityList = mCalendarTool.getDateEntityList(
                                mNowCalendarPoint.x + 1, 1);
                    } else {
                        mDateEntityList = mCalendarTool.getDateEntityList(
                                mNowCalendarPoint.x, mNowCalendarPoint.y + 1);
                    }
                    mAdapter.setDateList(mDateEntityList);
                    mAdapter.notifyDataSetChanged();
                    mNowCalendarPoint = mCalendarTool.getNowCalendar();
                    mCalendarTv.setText(mNowCalendarPoint.x + 年
                            + mNowCalendarPoint.y + 月);
                }
                break;
            }
        }

    }

    private void setListeners() {
        ivBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                MainActivity.this.finish();
            }
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}

模擬數據說明:在2015年8月25日(包含這天)前均有打卡記錄,模擬每月21、22號請假,23、24號遲到或早退,其他工作日正常出勤。模擬數據僅作展示效果之用。

代碼是最好的語言,再加上詳細的注釋,相信有一定Java編程基礎和Android應用開發經驗的人都能看懂。因為需要自己按照項目去擴展,本文只提供解決思路,希望讀者不要懶惰,只有讀懂本文的代碼邏輯才能擴展出你所需的代碼。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved