如何在android中添加日历提醒

时间:2014-08-08 10:53:00

标签: android android-intent android-activity android-calendar android-event

我是android的新手。我正在尝试创建一个日历,我可以为特定日期设置提醒。 例如,如果我在8月10日设置任何提醒,我应该收到通知 代码如下

CalendarView.java

 public class CalendarView extends Activity {

        public GregorianCalendar month, itemmonth;// calendar instances.

        public CalendarAdapter adapter;// adapter instance
        public Handler handler;// for grabbing some event values for showing the dot
                                // marker.
        public ArrayList<String> items; // container to store calendar items which
                                        // needs showing the event marker
        ArrayList<String> event;
        LinearLayout rLayout;
        ArrayList<String> date;
        ArrayList<String> desc;

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.calendar);
            Locale.setDefault(Locale.US);

            rLayout = (LinearLayout) findViewById(R.id.text);
            month = (GregorianCalendar) GregorianCalendar.getInstance();
            itemmonth = (GregorianCalendar) month.clone();

            items = new ArrayList<String>();

            adapter = new CalendarAdapter(this, month);

            GridView gridview = (GridView) findViewById(R.id.gridview);
            gridview.setAdapter(adapter);

            handler = new Handler();
            handler.post(calendarUpdater);

            TextView title = (TextView) findViewById(R.id.title);
            title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));

            RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous);

            previous.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    setPreviousMonth();
                    refreshCalendar();
                }
            });

            RelativeLayout next = (RelativeLayout) findViewById(R.id.next);
            next.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    setNextMonth();
                    refreshCalendar();

                }
            });

            gridview.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {
                    // removing the previous view if added
                    if (((LinearLayout) rLayout).getChildCount() > 0) {
                        ((LinearLayout) rLayout).removeAllViews();
                    }
                    desc = new ArrayList<String>();
                    date = new ArrayList<String>();
                    ((CalendarAdapter) parent.getAdapter()).setSelected(v);
                    String selectedGridDate = CalendarAdapter.dayString
                            .get(position);
                    String[] separatedTime = selectedGridDate.split("-");
                    String gridvalueString = separatedTime[2].replaceFirst("^0*",
                            "");// taking last part of date. ie; 2 from 2012-12-02.
                    int gridvalue = Integer.parseInt(gridvalueString);
                    // navigate to next or previous month on clicking offdays.
                    if ((gridvalue > 10) && (position < 8)) {
                        setPreviousMonth();
                        refreshCalendar();
                    } else if ((gridvalue < 7) && (position > 28)) {
                        setNextMonth();
                        refreshCalendar();
                    }
                    ((CalendarAdapter) parent.getAdapter()).setSelected(v);

                    for (int i = 0; i < Utility.startDates.size(); i++) {
                        if (Utility.startDates.get(i).equals(selectedGridDate)) {
                            desc.add(Utility.nameOfEvent.get(i));
                        }
                    }

                    if (desc.size() > 0) {
                        for (int i = 0; i < desc.size(); i++) {
                            TextView rowTextView = new TextView(CalendarView.this);

                            // set some properties of rowTextView or something
                            rowTextView.setText("Event:" + desc.get(i));
                            rowTextView.setTextColor(Color.BLACK);

                            // add the textview to the linearlayout
                            rLayout.addView(rowTextView);

                        }

                    }

                    desc = null;

                }

            });
        }

        protected void setNextMonth() {
            if (month.get(GregorianCalendar.MONTH) == month
                    .getActualMaximum(GregorianCalendar.MONTH)) {
                month.set((month.get(GregorianCalendar.YEAR) + 1),
                        month.getActualMinimum(GregorianCalendar.MONTH), 1);
            } else {
                month.set(GregorianCalendar.MONTH,
                        month.get(GregorianCalendar.MONTH) + 1);
            }

        }

        protected void setPreviousMonth() {
            if (month.get(GregorianCalendar.MONTH) == month
                    .getActualMinimum(GregorianCalendar.MONTH)) {
                month.set((month.get(GregorianCalendar.YEAR) - 1),
                        month.getActualMaximum(GregorianCalendar.MONTH), 1);
            } else {
                month.set(GregorianCalendar.MONTH,
                        month.get(GregorianCalendar.MONTH) - 1);
            }

        }

        protected void showToast(String string) {
            Toast.makeText(this, string, Toast.LENGTH_SHORT).show();

        }

        public void refreshCalendar() {
            TextView title = (TextView) findViewById(R.id.title);

            adapter.refreshDays();
            adapter.notifyDataSetChanged();
            handler.post(calendarUpdater); // generate some calendar items

            title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
        }

        public Runnable calendarUpdater = new Runnable() {

            @Override
            public void run() {
                items.clear();

                // Print dates of the current week
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
                String itemvalue;
                event = Utility.readCalendarEvent(CalendarView.this);
                Log.d("=====Event====", event.toString());
                Log.d("=====Date ARRAY====", Utility.startDates.toString());

                for (int i = 0; i < Utility.startDates.size(); i++) {
                    itemvalue = df.format(itemmonth.getTime());
                    itemmonth.add(GregorianCalendar.DATE, 1);
                    items.add(Utility.startDates.get(i).toString());
                }
                adapter.setItems(items);
                adapter.notifyDataSetChanged();
            }
        };
    }

CalendarAdapter.java

  public class CalendarAdapter extends BaseAdapter {
        private Context mContext;

        private java.util.Calendar month;
        public GregorianCalendar pmonth; // calendar instance for previous month
        /**
         * calendar instance for previous month for getting complete view
         */
        public GregorianCalendar pmonthmaxset;
        private GregorianCalendar selectedDate;
        int firstDay;
        int maxWeeknumber;
        int maxP;
        int calMaxP;
        int lastWeekDay;
        int leftDays;
        int mnthlength;
        String itemvalue, curentDateString;
        DateFormat df;

        private ArrayList<String> items;
        public static List<String> dayString;
        private View previousView;

        public CalendarAdapter(Context c, GregorianCalendar monthCalendar) {
            CalendarAdapter.dayString = new ArrayList<String>();
            Locale.setDefault(Locale.US);
            month = monthCalendar;
            selectedDate = (GregorianCalendar) monthCalendar.clone();
            mContext = c;
            month.set(GregorianCalendar.DAY_OF_MONTH, 1);
            this.items = new ArrayList<String>();
            df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
            curentDateString = df.format(selectedDate.getTime());
            refreshDays();
        }

        public void setItems(ArrayList<String> items) {
            for (int i = 0; i != items.size(); i++) {
                if (items.get(i).length() == 1) {
                    items.set(i, "0" + items.get(i));
                }
            }
            this.items = items;
        }

        public int getCount() {
            return dayString.size();
        }

        public Object getItem(int position) {
            return dayString.get(position);
        }

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

        // create a new view for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            TextView dayView;
            if (convertView == null) { // if it's not recycled, initialize some
                                        // attributes
                LayoutInflater vi = (LayoutInflater) mContext
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.calendar_item, null);

            }
            dayView = (TextView) v.findViewById(R.id.date);
            // separates daystring into parts.
            String[] separatedTime = dayString.get(position).split("-");
            // taking last part of date. ie; 2 from 2012-12-02
            String gridvalue = separatedTime[2].replaceFirst("^0*", "");
            // checking whether the day is in current month or not.
            if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) {
                // setting offdays to white color.
                dayView.setTextColor(Color.WHITE);
                dayView.setClickable(false);
                dayView.setFocusable(false);
            } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) {
                dayView.setTextColor(Color.WHITE);
                dayView.setClickable(false);
                dayView.setFocusable(false);
            } else {
                // setting curent month's days in blue color.
                dayView.setTextColor(Color.BLUE);
            }

            if (dayString.get(position).equals(curentDateString)) {
                setSelected(v);
                previousView = v;
            } else {
                v.setBackgroundResource(R.drawable.list_item_background);
            }
            dayView.setText(gridvalue);

            // create date string for comparison
            String date = dayString.get(position);

            if (date.length() == 1) {
                date = "0" + date;
            }
            String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1);
            if (monthStr.length() == 1) {
                monthStr = "0" + monthStr;
            }

            // show icon if date is not empty and it exists in the items array
            ImageView iw = (ImageView) v.findViewById(R.id.date_icon);
            if (date.length() > 0 && items != null && items.contains(date)) {
                iw.setVisibility(View.VISIBLE);
            } else {
                iw.setVisibility(View.INVISIBLE);
            }
            return v;
        }

        public View setSelected(View view) {
            if (previousView != null) {
                previousView.setBackgroundResource(R.drawable.list_item_background);
            }
            previousView = view;
            view.setBackgroundResource(R.drawable.calendar_cel_selectl);
            return view;
        }

        public void refreshDays() {
            // clear items
            items.clear();
            dayString.clear();
            Locale.setDefault(Locale.US);
            pmonth = (GregorianCalendar) month.clone();
            // month start day. ie; sun, mon, etc
            firstDay = month.get(GregorianCalendar.DAY_OF_WEEK);
            // finding number of weeks in current month.
            maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH);
            // allocating maximum row number for the gridview.
            mnthlength = maxWeeknumber * 7;
            maxP = getMaxP(); // previous month maximum day 31,30....
            calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ...
            /**
             * Calendar instance for getting a complete gridview including the three
             * month's (previous,current,next) dates.
             */
            pmonthmaxset = (GregorianCalendar) pmonth.clone();
            /**
             * setting the start date as previous month's required date.
             */
            pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1);

            /**
             * filling calendar gridview.
             */
            for (int n = 0; n < mnthlength; n++) {

                itemvalue = df.format(pmonthmaxset.getTime());
                pmonthmaxset.add(GregorianCalendar.DATE, 1);
                dayString.add(itemvalue);

            }
        }

        private int getMaxP() {
            int maxP;
            if (month.get(GregorianCalendar.MONTH) == month
                    .getActualMinimum(GregorianCalendar.MONTH)) {
                pmonth.set((month.get(GregorianCalendar.YEAR) - 1),
                        month.getActualMaximum(GregorianCalendar.MONTH), 1);
            } else {
                pmonth.set(GregorianCalendar.MONTH,
                        month.get(GregorianCalendar.MONTH) - 1);
            }
            maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);

            return maxP;
        }

    }

Utility.java

public class Utility {
    public static ArrayList<String> nameOfEvent = new ArrayList<String>();
    public static ArrayList<String> startDates = new ArrayList<String>();
    public static ArrayList<String> endDates = new ArrayList<String>();
    public static ArrayList<String> descriptions = new ArrayList<String>();

    public static ArrayList<String> readCalendarEvent(Context context) {
        Cursor cursor = context.getContentResolver()
                .query(Uri.parse("content://com.android.calendar/events"),
                        new String[] { "calendar_id", "title", "description",
                                "dtstart", "dtend", "eventLocation" }, null,
                        null, null);
        cursor.moveToFirst();
        // fetching calendars name
        String CNames[] = new String[cursor.getCount()];

        // fetching calendars id
        nameOfEvent.clear();
        startDates.clear();
        endDates.clear();
        descriptions.clear();
        for (int i = 0; i < CNames.length; i++) {

            nameOfEvent.add(cursor.getString(1));
            startDates.add(getDate(Long.parseLong(cursor.getString(3))));
            endDates.add(getDate(Long.parseLong(cursor.getString(4))));
            descriptions.add(cursor.getString(2));
            CNames[i] = cursor.getString(1);
            cursor.moveToNext();

        }
        return nameOfEvent;
    }

    public static String getDate(long milliSeconds) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
    }
}


Please Help.....

1 个答案:

答案 0 :(得分:0)

在这种情况下,当您设置提醒时,您可以获取它的日期。

通过使用该日期,您可以检查 CalendarAdapter.java getView 中的日期

......



//**reminderday** is the arraylist of Integer that contains list of reminder days
else if ( reminderday.contains(Integer.parseInt(gridvalue))){
            dayView.setTextColor(Color.RED);
            //or something you want with this view

    }



.......

您可以更改 dayView 以通知用户