Установите DatePicker DialogFragment для указания c даты - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий фрагмент диалога выбора даты, который работает отлично и устанавливает дату в тексте редактирования на дату, выбранную в окне выбора даты. Что мне нужно сделать, это установить дату в окне выбора даты на дату в тексте редактирования, если текст редактирования не пуст. Мой фрагмент диалога:

public class DatePickerFragment : Android.Support.V4.App.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 - 1,
                                                       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);
        Log.Debug(TAG, selectedDate.ToLongDateString());
        _dateSelectedHandler(selectedDate);
    }
}

Я вызываю фрагмент по щелчку текста редактирования, этот код:

        dob.Click += (sender, e) =>
        {
            DatePickerFragment frag = DatePickerFragment.NewInstance(delegate (DateTime time)
            {
                string thedate = time.ToShortDateString();
                if (Utils.Mid(thedate,2,1) == "/")
                {
                    thedate = "0" + thedate;
                }
                dob.Text = thedate;
            });
            frag.Show(SupportFragmentManager, DatePickerFragment.TAG);
        };

Я пробовал несколько методов, которые я видел на stackoverflow и пока еще ничего не сработало.

1 Ответ

0 голосов
/ 12 марта 2020

Я понял это. Довольно просто на самом деле. Для передачи данных во фрагмент вы используете связку. Я изменил вызов фрагмента, чтобы добавить пакет, содержащий начальную дату, следующим образом:

        dob.Click += (sender, e) =>
        {
            Bundle bundlee = new Bundle();
            bundlee.PutString("initDate", dob.Text);
            DatePickerFragment frag = DatePickerFragment.NewInstance(delegate (DateTime time)
            {
                string thedate = time.ToShortDateString();
                if (Utils.Mid(thedate,2,1) == "/")
                {
                    thedate = "0" + thedate;
                }
                dob.Text = thedate;
            });
            frag.Arguments = bundlee;
            frag.Show(SupportFragmentManager, DatePickerFragment.TAG);
        };

Затем в методе фрагмента OnCreateDialog я получаю данные из пакета и устанавливаю начальную дату средство выбора даты, вот так:

    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        Bundle bundlee = this.Arguments;
        int month = DateTime.Now.Month;
        int day = DateTime.Now.Day;
        int year = DateTime.Now.Year;
        string initDate = bundlee.GetString("initDate");
        if (initDate != "" && initDate != null)
        {
            month = Convert.ToInt32(Utils.Mid(initDate, 1, 2));
            day = Convert.ToInt32(Utils.Mid(initDate, 4, 2));
            year = Convert.ToInt32(Utils.Mid(initDate, 7, 4));

        }

        //DateTime currently = DateTime.Now;
        DatePickerDialog dialog = new DatePickerDialog(Activity,
                                                       this,
                                                       year,
                                                       month - 1,
                                                       day);

        return dialog;
    }

Будучи программистом VB на протяжении всей жизни, начиная с VB4, я просто не мог обойтись без функции Mid, поэтому я создал эквивалент в c# и поместил его в моем классе Utils (на случай, если вам интересно, откуда это):

class Utils
{
     public static string Mid(string input, int index, char newChar)

    {

        if (input == null)

        {

            throw new ArgumentNullException("input");

        }

        char[] chars = input.ToCharArray();

        chars[index - 1] = newChar;

        return new string(chars);

    }
    public static string Mid(string s, int a, int b)

    {

        string temp = s.Substring(a - 1, b);

        return temp;

    }
}
...