انتخابگرها را به برنامه خود اضافه کنید

Android کنترل‌هایی را برای کاربر فراهم می‌کند تا زمان یا تاریخ را به عنوان دیالوگ‌های آماده برای استفاده انتخاب کند. این انتخابگرها کنترل هایی را برای انتخاب هر قسمت از زمان (ساعت، دقیقه، AM/PM) یا تاریخ (ماه، روز، سال) فراهم می کنند.

نمونه ای از انتخابگر زمان از material.io
شکل 1. انتخاب ساعت در انتخابگر تقویم تلفن همراه.

استفاده از این انتخاب‌کننده‌ها کمک می‌کند تا اطمینان حاصل شود که کاربران شما می‌توانند زمان یا تاریخی را انتخاب کنند که معتبر است، به‌درستی قالب‌بندی شده و با منطقه کاربر تنظیم شده است.

نمونه ای از انتخابگر تاریخ معین از material.io
شکل 2. انتخابگر تاریخ معین.

توصیه می کنیم از DialogFragment برای میزبانی هر زمان یا انتخابگر تاریخ استفاده کنید. DialogFragment چرخه عمر گفتگو را برای شما مدیریت می کند و به شما امکان می دهد انتخابگرها را در پیکربندی های مختلف چیدمان نمایش دهید، مانند یک گفتگوی اصلی در گوشی ها یا به عنوان بخشی جاسازی شده از طرح بندی در صفحه های بزرگ.

انتخابگر زمان ایجاد کنید

برای نمایش TimePickerDialog با استفاده از DialogFragment ، یک کلاس قطعه تعریف کنید که DialogFragment گسترش دهد و یک TimePickerDialog را از متد onCreateDialog() قطعه برگردانید.

DialogFragment را برای انتخابگر زمان گسترش دهید

برای تعریف یک DialogFragment برای TimePickerDialog ، موارد زیر را انجام دهید:

  • متد onCreateDialog() را برای برگرداندن نمونه ای از TimePickerDialog تعریف کنید.
  • رابط TimePickerDialog.OnTimeSetListener را برای دریافت پاسخ تماس زمانی که کاربر زمان را تنظیم می کند، پیاده سازی کنید.

در اینجا یک مثال است:

کاتلین

class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // Use the current time as the default values for the picker.
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR_OF_DAY)
        val minute = c.get(Calendar.MINUTE)

        // Create a new instance of TimePickerDialog and return it.
        return TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity))
    }

    override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {
        // Do something with the time the user picks.
    }
}

جاوا

public static class TimePickerFragment extends DialogFragment
                            implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker.
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it.
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        // Do something with the time the user picks.
    }
}

برای اطلاعات در مورد آرگومان های سازنده به کلاس TimePickerDialog مراجعه کنید.

اکنون فقط به رویدادی نیاز دارید که نمونه ای از این قطعه را به فعالیت شما اضافه کند.

انتخابگر زمان را نشان دهید

بعد از اینکه یک DialogFragment مانند مثال قبل تعریف کردید، می توانید با ایجاد یک نمونه از DialogFragment و فراخوانی show() انتخابگر زمان را نمایش دهید.

به عنوان مثال، در اینجا دکمه ای وجود دارد که با ضربه زدن روی آن، روشی برای نمایش دیالوگ فراخوانی می شود:

<Button
    android:id="@+id/pickTime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick time" />

وقتی کاربر روی این دکمه ضربه می زند، سیستم روش زیر را فراخوانی می کند:

کاتلین

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker")
}

جاوا

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker");
}

این متد show() را در یک نمونه جدید از DialogFragment که در مثال قبل تعریف شده است فراخوانی می کند. متد show() به یک نمونه از FragmentManager و یک نام تگ منحصر به فرد برای قطعه نیاز دارد.

انتخابگر تاریخ ایجاد کنید

ایجاد یک DatePickerDialog مانند ایجاد TimePickerDialog است. تفاوت در گفتگوی است که برای قطعه ایجاد می کنید.

برای نمایش یک DatePickerDialog با استفاده از DialogFragment ، یک کلاس قطعه تعریف کنید که DialogFragment گسترش دهد و یک DatePickerDialog را از متد onCreateDialog() قطعه برگردانید.

DialogFragment را برای انتخابگر تاریخ گسترش دهید

برای تعریف یک DialogFragment برای DatePickerDialog ، موارد زیر را انجام دهید:

  • متد onCreateDialog() را برای برگرداندن نمونه ای از DatePickerDialog تعریف کنید.
  • رابط DatePickerDialog.OnDateSetListener را پیاده سازی کنید تا زمانی که کاربر تاریخ را تنظیم می کند، پاسخ تماس دریافت کنید.

در اینجا یک مثال است:

کاتلین

class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // Use the current date as the default date in the picker.
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        // Create a new instance of DatePickerDialog and return it.
        return DatePickerDialog(requireContext(), this, year, month, day)

    }

    override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
        // Do something with the date the user picks.
    }
}

جاوا

public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker.
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it.
        return new DatePickerDialog(requireContext(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date the user picks.
    }
}

برای اطلاعات در مورد آرگومان های سازنده به کلاس DatePickerDialog مراجعه کنید.

شما فقط به یک رویداد نیاز دارید که نمونه ای از این قطعه را به فعالیت شما اضافه کند.

انتخابگر تاریخ را نشان دهید

بعد از اینکه یک DialogFragment مانند مثال قبل تعریف کردید، می توانید انتخابگر تاریخ را با ایجاد نمونه ای از DialogFragment و فراخوانی show() نمایش دهید.

به عنوان مثال، در اینجا دکمه ای وجود دارد که با ضربه زدن روی آن، روشی برای نمایش دیالوگ فراخوانی می شود:

<Button
    android:id="@+id/pickDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick date"/>

وقتی کاربر روی این دکمه ضربه می زند، سیستم روش زیر را فراخوانی می کند:

کاتلین

findViewById<Button>(R.id.pickDate).setOnClickListener {
    val newFragment = DatePickerFragment()
    newFragment.show(supportFragmentManager, "datePicker")
}

جاوا

findViewById<Button>(R.id.pickDate).setOnClickListener {
    val newFragment = DatePickerFragment();
    newFragment.show(supportFragmentManager, "datePicker");
}

این متد show() را در یک نمونه جدید از DialogFragment که در مثال قبل تعریف شده است فراخوانی می کند. متد show() به یک نمونه از FragmentManager و یک نام تگ منحصر به فرد برای قطعه نیاز دارد.

از انتخابگرها با تکمیل خودکار استفاده کنید

در سال 2017، اندروید چارچوب تکمیل خودکار را معرفی کرد که به کاربران امکان می‌دهد داده‌هایی را ذخیره کنند که می‌توان از آنها برای پر کردن فرم‌ها در برنامه‌های مختلف استفاده کرد. انتخاب‌کننده‌ها می‌توانند با ارائه یک رابط کاربری که به کاربران اجازه می‌دهد مقدار فیلدی را که داده‌های تاریخ یا زمان را ذخیره می‌کند تغییر دهند، در سناریوهای تکمیل خودکار مفید باشند. به عنوان مثال، در فرم کارت اعتباری، انتخابگر تاریخ به کاربران اجازه می دهد تاریخ انقضای کارت اعتباری خود را وارد کرده یا تغییر دهند.

از آنجایی که انتخابگرها دیالوگ هستند، در یک فعالیت همراه با سایر فیلدها نمایش داده نمی شوند. برای نمایش داده‌های انتخابگر زمانی که انتخابگر قابل مشاهده نیست، می‌توانید از نمای دیگری مانند EditText استفاده کنید، که می‌تواند زمانی که انتخابگر قابل مشاهده نیست، مقدار را نمایش دهد.

یک شی EditText به طور بومی انتظار تکمیل خودکار داده از نوع AUTOFILL_TYPE_TEXT را دارد. در مقابل، سرویس‌های تکمیل خودکار داده‌ها را به‌عنوان AUTOFILL_TYPE_DATE ذخیره می‌کنند تا نمایش مناسبی از آن ایجاد کنند. برای رفع ناسازگاری در انواع، توصیه می‌کنیم یک نمای سفارشی ایجاد کنید که از EditText به ارث می‌رسد و روش‌های مورد نیاز برای مدیریت صحیح مقادیر از نوع AUTOFILL_TYPE_DATE را پیاده‌سازی می‌کند.

مراحل زیر را برای ایجاد یک زیر کلاس از EditText انجام دهید که بتواند مقادیری از نوع AUTOFILL_TYPE_DATE را مدیریت کند:

  1. کلاسی ایجاد کنید که از EditText ارث می برد.
  2. متد getAutofillType() پیاده سازی کنید که AUTOFILL_TYPE_DATE را برمی گرداند.
  3. متد getAutofillValue() را پیاده سازی کنید که یک شی AutofillValue را برمی گرداند که تاریخ را بر حسب میلی ثانیه نشان می دهد. برای ایجاد شی بازگشتی، از متد forDate() برای تولید یک شی AutofillValue استفاده کنید.
  4. متد autofill() پیاده سازی کنید. این روش منطقی را برای کنترل پارامتر AutofillValue ، که از نوع AUTOFILL_TYPE_DATE است، فراهم می کند. برای مدیریت پارامتر، یک نمایش رشته مناسب از آن ایجاد کنید، مانند mm/yyyy . از نمایش رشته برای تنظیم ویژگی text نمای خود استفاده کنید.
  5. عملکردی را اجرا کنید که وقتی کاربر می‌خواهد تاریخ را در زیر کلاس سفارشی EditText ویرایش کند، یک انتخابگر را نمایش می‌دهد. View ویژگی text را با نمایش رشته ای از مقداری که کاربر در انتخابگر انتخاب می کند، به روز می کند.

برای مثالی از زیر کلاس EditText که مقادیر AUTOFILL_TYPE_DATE کنترل می کند، نمونه چارچوب Autofill را در جاوا یا Kotlin ببینید.

برای کسب اطلاعات بیشتر در مورد اثبات پشتیبانی تکمیل خودکار برای نماهای سفارشی خود، به چارچوب تکمیل خودکار مراجعه کنید.