3

enter image description here

Hi I am facing issue in showing dot or text on calendar date of native calendar view, I tried but there is no code available in Xamarin native, so please help me to resolve this issue.

Below is my code:

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.CalendarView);
        // Create your application here
        calendar = FindViewById<CalendarView>(Resource.Id.calendar);
        calendar.DateChange += CalendarOnDateChange;
    }

    #region Set Date in DatePicker
    void DateSelect_Start(object sender, EventArgs eventArgs)
    {
        DatePickerFragment start = DatePickerFragment.NewInstance(delegate (DateTime time)
        {
            _dateDisplayStart.Text = time.Date.ToString("d");
            _dateDisplayEnd.Text = time.Date.ToString("d");
        });
        start.Show(FragmentManager, DatePickerFragment.TAG);
    }

    void DateSelect_End(object sender, EventArgs eventArgs)
    {
        DatePickerFragment end = DatePickerFragment.NewInstance(delegate (DateTime time)
        {
            _dateDisplayEnd.Text = time.Date.ToString("d");
        });
        end.Show(FragmentManager, DatePickerFragment.TAG);
    }
    #endregion

    private void CalendarOnDateChange(object sender, CalendarView.DateChangeEventArgs args)
    {
        newdatetime = new DateTime(args.Year, args.Month + 1, args.DayOfMonth);

        TextViewCalendar = FindViewById<TextView>(Resource.Id.TextViewCalendar);
        //tv.Text = "Schedule for Date: " + newdatetime.ToString();
        builder = new Android.Support.V7.App.AlertDialog.Builder(this);
        var dialogView = LayoutInflater.Inflate(Resource.Layout.CalendarPopup, null);
        builder.SetView(dialogView);

        Button bt_save = dialogView.FindViewById<Button>(Resource.Id.button_save);
        Button bt_cancel = dialogView.FindViewById<Button>(Resource.Id.button_cancel);
        tx_start = dialogView.FindViewById<TextView>(Resource.Id.textView_date);
        tx_end = dialogView.FindViewById<TextView>(Resource.Id.textView_enddate);
        ed_popup = dialogView.FindViewById<EditText>(Resource.Id.editText_Title);

        _dateDisplayStart = dialogView.FindViewById<TextView>(Resource.Id.textView_date);
        _dateSelectButtonStart = dialogView.FindViewById<ImageView>(Resource.Id.imageView_calendar);
        _dateSelectButtonStart.Click += DateSelect_Start;

        _dateDisplayEnd = dialogView.FindViewById<TextView>(Resource.Id.textView_enddate);
        _dateSelectButtonEnd = dialogView.FindViewById<ImageView>(Resource.Id.imageView_calendartwo);
        _dateSelectButtonEnd.Click += DateSelect_End;

        bt_save.Click += SaveChanges;
        bt_cancel.Click += CancelChanges;
        tx_start.Text = newdatetime.Date.ToString("d");
        tx_end.Text = newdatetime.Date.ToString("d");

        alert = builder.Create();
        alert.Show();

    }

    void SaveChanges(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(ed_popup.Text))
        {
            ed_popup.Error = "Leave reason";
        }
        else
        {

            string textCalendar = ed_popup.Text.ToString() + " " + newdatetime.Date.ToString("d");
            TextViewCalendar.Text = textCalendar;
            alert.Dismiss();
        }
    }

    void CancelChanges(object sender, EventArgs e)
    {
        alert.Dismiss();
    }

    public class DatePickerFragment : DialogFragment,
                              DatePickerDialog.IOnDateSetListener
    {
        // TAG can be any string of your choice.
        public static readonly string TAG = "X:" + typeof(DatePickerFragment).Name.ToUpper();

        // Initialize this value to prevent NullReferenceExceptions.
        Action<DateTime> _dateSelectedHandler = delegate { };

        public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
        {
            DatePickerFragment frag = new DatePickerFragment();
            frag._dateSelectedHandler = onDateSelected;
            return frag;
        }

        public override Dialog OnCreateDialog(Bundle savedInstanceState)
        {
            DateTime currently = DateTime.Now;
            DatePickerDialog dialog = new DatePickerDialog(Activity, this, currently.Year, currently.Month, currently.Day);
            return dialog;
        }

        public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
        {
            // Note: monthOfYear is a value between 0 and 11, not 1 and 12!
            DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
            Android.Util.Log.Debug(TAG, selectedDate.ToLongDateString());
            _dateSelectedHandler(selectedDate);
        }
    }
}

and layout code

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f8f1e8"
    android:orientation="vertical">
    <CalendarView
        android:id="@+id/calendar"
        android:layout_width="match_parent"
        android:layout_height="350dp"
        android:background="#ffffff"
        android:theme="@android:style/Theme.Holo.Light.DarkActionBar" />
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/calendar"
        android:background="#db9b55" />
    <TextView
        android:id="@+id/TextViewCalendar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Date"
        android:textColor="#000000"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="15dp" />
    <ListView
        android:id="@+id/list_calendar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
Rohit Vipin Mathews
  • 11,629
  • 15
  • 57
  • 112
Sumit Pathak
  • 529
  • 2
  • 7
  • 24

1 Answers1

1

Please find the below code for adding an appointment, this is used in Xamarin.Forms. You can specify your applications Context.

public void AddAppointment(string title, string description, DateTime startDate, DateTime endDate)
{
            Intent intent = new Intent(Intent.ActionInsert);

            intent.PutExtra(CalendarContract.Events.InterfaceConsts.Title, title);
            intent.PutExtra(CalendarContract.Events.InterfaceConsts.Description, description);

            intent.PutExtra(CalendarContract.Events.InterfaceConsts.Dtstart, GetDateTimeMs(startDate));
            intent.PutExtra(CalendarContract.Events.InterfaceConsts.Dtend, GetDateTimeMs(endDate));
            intent.PutExtra(CalendarContract.ExtraEventBeginTime, GetDateTimeMs(startDate));
            intent.PutExtra(CalendarContract.ExtraEventEndTime, GetDateTimeMs(endDate));

            intent.PutExtra(CalendarContract.Events.InterfaceConsts.EventTimezone, "UTC");
            intent.PutExtra(CalendarContract.Events.InterfaceConsts.EventEndTimezone, "UTC");
            intent.SetData(CalendarContract.Events.ContentUri);
            ((Activity)Forms.Context).StartActivity(intent);
}

EDIT 1 (As per OP's new requirement of showing the native calendar with events in the app):

The CalendarView does not support showing events in it. You can read more about creating a custom calendar view and adding the capabilities in the SO question - Android CalendarView for Showing Events.

You can use the ExtendedCalendarView Java project as base and create the C# version of the code.

Currently there is no easy way of showing a calendar with the ability to display events on days, ExtendedCalendarView is meant to solve that problem.

Community
  • 1
  • 1
Rohit Vipin Mathews
  • 11,629
  • 15
  • 57
  • 112