আপনার অ্যাপে পিকার যোগ করুন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
জেটপ্যাক কম্পোজ হলো অ্যান্ড্রয়েডের জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে কীভাবে কম্পোনেন্ট যোগ করতে হয় তা জানুন।

অ্যান্ড্রয়েড ব্যবহারকারীকে সময় বা তারিখ বেছে নেওয়ার জন্য রেডি-টু-ইউজ ডায়ালগ হিসেবে কন্ট্রোল প্রদান করে। এই পিকারগুলোতে সময়ের প্রতিটি অংশ (ঘণ্টা, মিনিট, AM/PM) বা তারিখের প্রতিটি অংশ (মাস, দিন, বছর) নির্বাচন করার জন্য কন্ট্রোল থাকে।

material.io থেকে টাইম পিকারের একটি উদাহরণ
চিত্র ১. মোবাইল ক্যালেন্ডার পিকার-এ ঘণ্টা নির্বাচন।

এই পিকারগুলো ব্যবহার করলে এটা নিশ্চিত করা যায় যে, আপনার ব্যবহারকারীরা এমন একটি সময় বা তারিখ বেছে নিতে পারবেন যা বৈধ, সঠিকভাবে ফরম্যাট করা এবং ব্যবহারকারীর স্থানীয় ভাষার সাথে সামঞ্জস্যপূর্ণ।

material.io থেকে মোডাল ডেট পিকারের একটি উদাহরণ
চিত্র ২. মোডাল ডেট পিকার।

আমরা প্রতিটি সময় বা তারিখ পিকার হোস্ট করার জন্য DialogFragment ব্যবহার করার পরামর্শ দিই। DialogFragment আপনার জন্য ডায়ালগের জীবনচক্র পরিচালনা করে এবং আপনাকে বিভিন্ন লেআউট কনফিগারেশনে পিকারগুলি প্রদর্শন করতে দেয়, যেমন হ্যান্ডসেটে একটি সাধারণ ডায়ালগে অথবা বড় স্ক্রিনে লেআউটের একটি এমবেডেড অংশ হিসাবে।

একটি সময় বাছাইকারী তৈরি করুন

DialogFragment ব্যবহার করে একটি TimePickerDialog প্রদর্শন করতে, DialogFragment এক্সটেন্ড করে এমন একটি ফ্র্যাগমেন্ট ক্লাস সংজ্ঞায়িত করুন এবং ফ্র্যাগমেন্টটির onCreateDialog() মেথড থেকে একটি TimePickerDialog রিটার্ন করুন।

টাইম পিকারের জন্য DialogFragment-কে প্রসারিত করুন

একটি TimePickerDialog জন্য DialogFragment সংজ্ঞায়িত করতে, নিম্নলিখিতগুলি করুন:

  • 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");
}

এই মেথডটি পূর্ববর্তী উদাহরণে সংজ্ঞায়িত DialogFragment এর একটি নতুন ইনস্ট্যান্সে show() মেথডকে কল করে। show() মেথডটির জন্য FragmentManager এর একটি ইনস্ট্যান্স এবং ফ্র্যাগমেন্টটির জন্য একটি অনন্য ট্যাগ নাম প্রয়োজন।

একটি তারিখ বাছাইকারী তৈরি করুন

DatePickerDialog তৈরি করা TimePickerDialog তৈরি করার মতোই। পার্থক্য হলো ফ্র্যাগমেন্টের জন্য আপনি যে ডায়ালগটি তৈরি করেন তাতে।

DialogFragment ব্যবহার করে একটি DatePickerDialog প্রদর্শন করতে, DialogFragment এক্সটেন্ড করে এমন একটি ফ্র্যাগমেন্ট ক্লাস সংজ্ঞায়িত করুন এবং ফ্র্যাগমেন্টটির onCreateDialog() মেথড থেকে একটি DatePickerDialog রিটার্ন করুন।

তারিখ পিকারের জন্য DialogFragment প্রসারিত করুন

একটি DatePickerDialog জন্য DialogFragment নির্ধারণ করতে, নিম্নলিখিতগুলি করুন:

  • 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");
}

এই মেথডটি পূর্ববর্তী উদাহরণে সংজ্ঞায়িত DialogFragment এর একটি নতুন ইনস্ট্যান্সে show() মেথডকে কল করে। show() মেথডটির জন্য FragmentManager এর একটি ইনস্ট্যান্স এবং ফ্র্যাগমেন্টটির জন্য একটি অনন্য ট্যাগ নাম প্রয়োজন।

অটোফিলের সাথে পিকার ব্যবহার করুন

২০১৭ সালে অ্যান্ড্রয়েড অটোফিল ফ্রেমওয়ার্ক চালু করে, যা ব্যবহারকারীদের এমন ডেটা সংরক্ষণ করতে দেয় যা বিভিন্ন অ্যাপের ফর্ম পূরণ করতে ব্যবহার করা যায়। অটোফিলের ক্ষেত্রে পিকারগুলো বেশ কার্যকর হতে পারে, কারণ এগুলো এমন একটি ইউজার ইন্টারফেস (UI) প্রদান করে যার মাধ্যমে ব্যবহারকারীরা তারিখ বা সময়ের ডেটা সংরক্ষণকারী কোনো ফিল্ডের মান পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, একটি ক্রেডিট কার্ড ফর্মে, একটি ডেট পিকার ব্যবহারকারীদের তাদের ক্রেডিট কার্ডের মেয়াদ শেষ হওয়ার তারিখ লিখতে বা পরিবর্তন করতে দেয়।

যেহেতু পিকারগুলো ডায়ালগ, তাই এগুলো কোনো অ্যাক্টিভিটিতে অন্যান্য ফিল্ডের সাথে প্রদর্শিত হয় না। পিকারটি যখন দৃশ্যমান থাকে না, তখন এর ডেটা দেখানোর জন্য আপনি অন্য কোনো ভিউ, যেমন একটি EditText , ব্যবহার করতে পারেন, যা পিকারটি অদৃশ্য থাকা অবস্থায় এর মান প্রদর্শন করতে পারে।

একটি EditText অবজেক্ট স্বাভাবিকভাবে AUTOFILL_TYPE_TEXT টাইপের অটোফিল ডেটা আশা করে। এর বিপরীতে, অটোফিল সার্ভিসগুলো ডেটার একটি উপযুক্ত উপস্থাপনা তৈরি করার জন্য সেটিকে AUTOFILL_TYPE_DATE হিসেবে সংরক্ষণ করে। টাইপের এই অসামঞ্জস্যতা সমাধান করার জন্য, আমরা আপনাকে একটি কাস্টম ভিউ তৈরি করার পরামর্শ দিচ্ছি যা EditText থেকে ইনহেরিট করবে এবং AUTOFILL_TYPE_DATE টাইপের ভ্যালুগুলো সঠিকভাবে হ্যান্ডেল করার জন্য প্রয়োজনীয় মেথডগুলো ইমপ্লিমেন্ট করবে।

AUTOFILL_TYPE_DATE টাইপের মান পরিচালনা করতে পারে এমন EditText এর একটি সাবক্লাস তৈরি করতে নিম্নলিখিত পদক্ষেপগুলি নিন:

  1. এমন একটি ক্লাস তৈরি করুন যা EditText থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
  2. getAutofillType() মেথডটি ইমপ্লিমেন্ট করুন, যা AUTOFILL_TYPE_DATE রিটার্ন করে।
  3. getAutofillValue() মেথডটি ইমপ্লিমেন্ট করুন, যা একটি AutofillValue অবজেক্ট রিটার্ন করে এবং এই অবজেক্টটি মিলিসেকেন্ডে তারিখ প্রকাশ করে। রিটার্ন অবজেক্টটি তৈরি করার জন্য, forDate() মেথড ব্যবহার করে একটি AutofillValue অবজেক্ট জেনারেট করুন।
  4. autofill() মেথডটি ইমপ্লিমেন্ট করুন। এই মেথডটি AutofillValue প্যারামিটারটি হ্যান্ডেল করার লজিক প্রদান করে, যার টাইপ হলো AUTOFILL_TYPE_DATE । প্যারামিটারটি হ্যান্ডেল করার জন্য, এটির একটি উপযুক্ত স্ট্রিং রিপ্রেজেন্টেশন তৈরি করুন, যেমন mm/yyyy । আপনার ভিউ-এর text প্রপার্টি সেট করতে এই স্ট্রিং রিপ্রেজেন্টেশনটি ব্যবহার করুন।
  5. EditText এর কাস্টম সাবক্লাসে ব্যবহারকারী যখন তারিখ সম্পাদনা করতে চান, তখন একটি পিকার প্রদর্শনের কার্যকারিতা বাস্তবায়ন করুন। ব্যবহারকারীর পিকার থেকে নির্বাচিত মানটির স্ট্রিং উপস্থাপনা দিয়ে ভিউটি text প্রপার্টি আপডেট করে।

EditText এর এমন একটি সাবক্লাসের উদাহরণের জন্য যা AUTOFILL_TYPE_DATE ভ্যালুগুলো হ্যান্ডেল করে, Java বা Kotlin- এ লেখা Autofill Framework স্যাম্পলটি দেখুন।

আপনার কাস্টম ভিউগুলির জন্য অটোফিল সাপোর্ট প্রদান করার বিষয়ে আরও জানতে, অটোফিল ফ্রেমওয়ার্ক দেখুন।