Android Kotlin Fundamentals 06.3: বোতামের অবস্থা নিয়ন্ত্রণ করতে LiveData ব্যবহার করুন

এই কোডল্যাবটি Android Kotlin Fundamentals কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

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

কোডল্যাবটি ন্যূনতম কোড সহ বোতামের অবস্থাগুলিকে ট্র্যাক করার একটি চতুর উপায় দেখিয়ে শেষ করে, যাতে প্রতিটি বোতাম সক্রিয় হয় এবং ক্লিক করা যায় শুধুমাত্র তখনই যখন ব্যবহারকারীর পক্ষে সেই বোতামটি ট্যাপ করা বোঝা যায়।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • একটি ক্রিয়াকলাপ, টুকরো এবং দৃশ্য ব্যবহার করে একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা।
  • টুকরোগুলির মধ্যে নেভিগেট করা এবং টুকরোগুলির মধ্যে ডেটা পাস করতে safeArgs ব্যবহার করে৷
  • মডেল দেখুন, মডেল কারখানা, রূপান্তর, এবং LiveData এবং তাদের পর্যবেক্ষক দেখুন।
  • কিভাবে একটি Room ডাটাবেস তৈরি করতে হয়, একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) তৈরি করতে হয় এবং সত্তাকে সংজ্ঞায়িত করতে হয়।
  • ডাটাবেস মিথস্ক্রিয়া এবং অন্যান্য দীর্ঘ-চলমান কাজগুলির জন্য কোরোটিনগুলি কীভাবে ব্যবহার করবেন।

আপনি কি শিখবেন

  • ডাটাবেসে বিদ্যমান ঘুমের মানের রেকর্ড কীভাবে আপডেট করবেন।
  • বোতামের অবস্থা ট্র্যাক করতে কিভাবে LiveData ব্যবহার করবেন।
  • একটি ইভেন্টের প্রতিক্রিয়া হিসাবে একটি স্ন্যাকবার কীভাবে প্রদর্শন করবেন।

আপনি কি করবেন

  • একটি গুণমানের রেটিং সংগ্রহ করতে, ডাটাবেসে রেটিং যোগ করতে এবং ফলাফল প্রদর্শন করতে TrackMySleepQuality অ্যাপটি প্রসারিত করুন।
  • একটি স্ন্যাকবারের প্রদর্শন ট্রিগার করতে LiveData ব্যবহার করুন।
  • বোতাম সক্রিয় এবং নিষ্ক্রিয় করতে LiveData ব্যবহার করুন।

এই কোডল্যাবে, আপনি ঘুমের মানের রেকর্ডিং এবং TrackMySleepQuality অ্যাপের চূড়ান্ত UI তৈরি করেন।

অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার বোতাম রয়েছে৷ স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটা দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে।

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

ব্যবহারকারীর প্রবাহ নিম্নরূপ:

  • ব্যবহারকারী অ্যাপটি খোলে এবং স্লিপ-ট্র্যাকিং স্ক্রিন দিয়ে উপস্থাপিত হয়।
  • ব্যবহারকারী স্টার্ট বোতামে ট্যাপ করে। এটি শুরুর সময় রেকর্ড করে এবং এটি প্রদর্শন করে। স্টার্ট বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টপ বোতামটি সক্রিয় করা হয়েছে।
  • ব্যবহারকারী স্টপ বোতামে ট্যাপ করে। এটি শেষের সময় রেকর্ড করে এবং ঘুমের মানের স্ক্রিন খোলে।
  • ব্যবহারকারী একটি ঘুমের মানের আইকন নির্বাচন করে। স্ক্রিন বন্ধ হয়ে যায়, এবং ট্র্যাকিং স্ক্রীন ঘুমের শেষ সময় এবং ঘুমের গুণমান প্রদর্শন করে। স্টপ বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টার্ট বোতামটি সক্ষম করা হয়েছে। অ্যাপটি অন্য রাতের জন্য প্রস্তুত।
  • যখনই ডাটাবেসে ডেটা থাকে তখন ক্লিয়ার বোতামটি সক্রিয় থাকে। ব্যবহারকারী যখন ক্লিয়ার বোতামে ট্যাপ করে, তখন তাদের সমস্ত ডেটা অবলম্বন ছাড়াই মুছে ফেলা হয় — সেখানে "আপনি কি নিশ্চিত?" বার্তা

এই অ্যাপটি একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে, যেমনটি সম্পূর্ণ আর্কিটেকচারের প্রসঙ্গে নীচে দেখানো হয়েছে। অ্যাপ্লিকেশন শুধুমাত্র নিম্নলিখিত উপাদান ব্যবহার করে:

  • UI কন্ট্রোলার
  • মডেল এবং LiveData দেখুন
  • একটি রুম ডাটাবেস

এই কোডল্যাব ধরে নেয় যে আপনি জানেন কিভাবে টুকরো এবং নেভিগেশন ফাইল ব্যবহার করে নেভিগেশন বাস্তবায়ন করতে হয়। আপনার কাজ বাঁচাতে, এই কোডের একটি ভাল চুক্তি প্রদান করা হয়েছে।

ধাপ 1: কোড পরিদর্শন করুন

  1. শুরু করতে, শেষ কোডল্যাবের শেষ থেকে আপনার নিজের কোড দিয়ে চালিয়ে যান, অথবা স্টার্টার কোডটি ডাউনলোড করুন
  2. আপনার স্টার্টার কোডে, SleepQualityFragment পরিদর্শন করুন। এই ক্লাসটি লেআউটকে স্ফীত করে, অ্যাপ্লিকেশন পায় এবং binding.root
  3. ডিজাইন এডিটরে navigation.xml খুলুন। আপনি দেখতে পাচ্ছেন যে SleepQualityFragment থেকে SleepTrackerFragment এ একটি নেভিগেশন পথ রয়েছে এবং আবার SleepQualityFragment SleepTrackerFragment ফিরে যান।



  4. navigation.xml- এর জন্য কোডটি পরীক্ষা করুন। বিশেষ করে, sleepNightKey নামের <argument> সন্ধান করুন

    ব্যবহারকারী যখন SleepTrackerFragment থেকে SleepQualityFragment, অ্যাপটি সেই রাতের জন্য SleepQualityFragment এ একটি sleepNightKey পাঠাবে যা আপডেট করা দরকার।

ধাপ 2: ঘুমের মানের ট্র্যাকিংয়ের জন্য নেভিগেশন যোগ করুন

নেভিগেশন গ্রাফে ইতিমধ্যেই SleepTrackerFragment থেকে SleepQualityFragment এবং আবার ফিরে যাওয়ার পথগুলি অন্তর্ভুক্ত রয়েছে৷ যাইহোক, ক্লিক হ্যান্ডলারগুলি যেগুলি এক টুকরো থেকে পরবর্তীতে নেভিগেশন কার্যকর করে সেগুলি এখনও কোড করা হয়নি৷ আপনি এখন সেই ViewModel এ যোগ করুন।

ক্লিক হ্যান্ডলারে, আপনি একটি LiveData সেট করেন যা পরিবর্তিত হয় যখন আপনি অ্যাপটিকে একটি ভিন্ন গন্তব্যে নেভিগেট করতে চান। খণ্ডটি এই LiveData পর্যবেক্ষণ করে। ডেটা পরিবর্তন হলে, খণ্ডটি গন্তব্যে নেভিগেট করে এবং ভিউ মডেলকে বলে যে এটি হয়ে গেছে, যা স্টেট ভেরিয়েবল রিসেট করে।

  1. SleepTrackerViewModel খুলুন। আপনাকে নেভিগেশন যোগ করতে হবে যাতে ব্যবহারকারী যখন স্টপ বোতামে ট্যাপ করে, অ্যাপটি একটি গুণমানের রেটিং সংগ্রহ করতে SleepQualityFragment এ নেভিগেট করে।
  2. SleepTrackerViewModel এ, একটি LiveData তৈরি করুন যা পরিবর্তন হয় যখন আপনি অ্যাপটিকে SleepQualityFragment নেভিগেট করতে চান। LiveDataViewModel এর একটি পেতেযোগ্য সংস্করণ প্রকাশ করতে encapsulation ব্যবহার করুন।

    আপনি এই কোডটি ক্লাস বডির শীর্ষ স্তরের যে কোনও জায়গায় রাখতে পারেন।
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()

val navigateToSleepQuality: LiveData<SleepNight>
   get() = _navigateToSleepQuality
  1. একটি doneNavigating() ফাংশন যোগ করুন যা ন্যাভিগেশন ট্রিগার করে এমন ভেরিয়েবল রিসেট করে।
fun doneNavigating() {
   _navigateToSleepQuality.value = null
}
  1. স্টপ বোতামের জন্য ক্লিক হ্যান্ডলারে, onStopTracking() , SleepQualityFragment এ নেভিগেশন ট্রিগার করুন। launch{} ব্লকের ভিতরে শেষ জিনিস হিসাবে ফাংশনের শেষে _ navigateToSleepQuality ভেরিয়েবল সেট করুন। মনে রাখবেন যে এই পরিবর্তনশীলটি night জন্য সেট করা হয়েছে। যখন এই ভেরিয়েবলের একটি মান থাকে, অ্যাপটি SleepQualityFragment নেভিগেট করে, রাত পেরিয়ে যায়।
_navigateToSleepQuality.value = oldNight
  1. SleepTrackerFragment কে _ navigateToSleepQuality পর্যবেক্ষণ করতে হবে যাতে অ্যাপটি কখন নেভিগেট করতে হয় তা জানতে পারে। SleepTrackerFragment এ, onCreateView() -এ, navigateToSleepQuality() এর জন্য একজন পর্যবেক্ষক যোগ করুন। মনে রাখবেন যে এটির জন্য আমদানি অস্পষ্ট এবং আপনাকে androidx.lifecycle.Observer আমদানি করতে হবে।
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})

  1. পর্যবেক্ষক ব্লকের ভিতরে, নেভিগেট করুন এবং বর্তমান রাতের আইডি বরাবর পাস করুন, এবং তারপর doneNavigating() কল করুন। আপনার আমদানি অস্পষ্ট হলে, androidx.navigation.fragment.findNavController আমদানি করুন।
night ->
night?.let {
   this.findNavController().navigate(
           SleepTrackerFragmentDirections
                   .actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
   sleepTrackerViewModel.doneNavigating()
}
  1. আপনার অ্যাপ তৈরি করুন এবং চালান। শুরুতে আলতো চাপুন, তারপরে থামুন আলতো চাপুন, যা আপনাকে SleepQualityFragment স্ক্রিনে নিয়ে যাবে। ফিরে পেতে, সিস্টেম ব্যাক বোতামটি ব্যবহার করুন।

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

ধাপ 1: একটি ViewModel এবং একটি ViewModelFactory তৈরি করুন

  1. স্লিপ কোয়ালিটি প্যাকেজে, sleepquality তৈরি বা খুলুন
  2. একটি SleepQualityViewModel ক্লাস তৈরি করুন যা একটি sleepNightKey এবং ডাটাবেসকে আর্গুমেন্ট হিসেবে নেয়। ঠিক যেমন আপনি SleepTrackerViewModel এর জন্য করেছেন, আপনাকে ফ্যাক্টরি থেকে database পাস করতে হবে। আপনাকে নেভিগেশন থেকে sleepNightKey পাস করতে হবে।
class SleepQualityViewModel(
       private val sleepNightKey: Long = 0L,
       val database: SleepDatabaseDao) : ViewModel() {
}
  1. SleepQualityViewModel ক্লাসের ভিতরে, একটি Job এবং uiScope সংজ্ঞায়িত করুন এবং onCleared() ওভাররাইড করুন।
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}
  1. উপরের মত একই প্যাটার্ন ব্যবহার করে SleepTrackerFragment এ ফিরে যেতে, _navigateToSleepTracker ঘোষণা করুন। navigateToSleepTracker এবং doneNavigating() প্রয়োগ করুন।
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()

val navigateToSleepTracker: LiveData<Boolean?>
   get() = _navigateToSleepTracker

fun doneNavigating() {
   _navigateToSleepTracker.value = null
}
  1. একটি ক্লিক হ্যান্ডলার তৈরি করুন, onSetSleepQuality() , সমস্ত ঘুম-গুণমানের চিত্র ব্যবহারের জন্য।

    পূর্ববর্তী কোডল্যাবের মতো একই কোরোটিন প্যাটার্ন ব্যবহার করুন:
  • uiScope-এ একটি uiScope চালু করুন এবং I/O প্রেরণকারীতে স্যুইচ করুন।
  • sleepNightKey ব্যবহার করে tonight পান।
  • ঘুমের মান সেট করুন।
  • ডাটাবেস আপডেট করুন।
  • ট্রিগার নেভিগেশন.

লক্ষ্য করুন যে নীচের কোড নমুনাটি বিভিন্ন প্রসঙ্গে ডাটাবেস অপারেশনকে ফ্যাক্টর করার পরিবর্তে ক্লিক হ্যান্ডলারে সমস্ত কাজ করে।

fun onSetSleepQuality(quality: Int) {
        uiScope.launch {
            // IO is a thread pool for running operations that access the disk, such as
            // our Room database.
            withContext(Dispatchers.IO) {
                val tonight = database.get(sleepNightKey) ?: return@withContext
                tonight.sleepQuality = quality
                database.update(tonight)
            }

            // Setting this state variable to true will alert the observer and trigger navigation.
            _navigateToSleepTracker.value = true
        }
    }
  1. স্লিপ কোয়ালিটি প্যাকেজে, sleepquality তৈরি করুন বা খুলুন এবং SleepQualityViewModelFactory SleepQualityViewModelFactory.kt যোগ করুন। এই ক্লাসটি আপনি আগে দেখেছেন একই বয়লারপ্লেট কোডের একটি সংস্করণ ব্যবহার করে। আপনি এগিয়ে যাওয়ার আগে কোডটি পরীক্ষা করুন।
class SleepQualityViewModelFactory(
       private val sleepNightKey: Long,
       private val dataSource: SleepDatabaseDao) : ViewModelProvider.Factory {
   @Suppress("unchecked_cast")
   override fun <T : ViewModel?> create(modelClass: Class<T>): T {
       if (modelClass.isAssignableFrom(SleepQualityViewModel::class.java)) {
           return SleepQualityViewModel(sleepNightKey, dataSource) as T
       }
       throw IllegalArgumentException("Unknown ViewModel class")
   }
}

ধাপ 2: SleepQualityFragment আপডেট করুন

  1. SleepQualityFragment.kt খুলুন।
  2. onCreateView() এ, আপনি application পাওয়ার পরে, আপনাকে নেভিগেশনের সাথে আসা arguments পেতে হবে। এই আর্গুমেন্টগুলি SleepQualityFragmentArgs এ রয়েছে। আপনি বান্ডিল থেকে তাদের নিষ্কাশন করা প্রয়োজন.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
  1. এর পরে, dataSource
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
  1. dataSource এবং sleepNightKey পাস করে একটি কারখানা তৈরি করুন।
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
  1. একটি ViewModel রেফারেন্স পান।
val sleepQualityViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepQualityViewModel::class.java)
  1. বাইন্ডিং অবজেক্টে ViewModel যোগ করুন। (যদি আপনি বাইন্ডিং অবজেক্টের সাথে একটি ত্রুটি দেখতে পান তবে আপাতত এটি উপেক্ষা করুন।)
binding.sleepQualityViewModel = sleepQualityViewModel
  1. পর্যবেক্ষক যোগ করুন। অনুরোধ করা হলে, androidx.lifecycle.Observer আমদানি করুন।
sleepQualityViewModel.navigateToSleepTracker.observe(this, Observer {
   if (it == true) { // Observed state is true.
       this.findNavController().navigate(
               SleepQualityFragmentDirections.actionSleepQualityFragmentToSleepTrackerFragment())
       sleepQualityViewModel.doneNavigating()
   }
})

ধাপ 3: লেআউট ফাইল আপডেট করুন এবং অ্যাপটি চালান

  1. fragment_sleep_quality.xml লেআউট ফাইলটি খুলুন। <data> ব্লকে, SleepQualityViewModel এর জন্য একটি ভেরিয়েবল যোগ করুন।
 <data>
       <variable
           name="sleepQualityViewModel"
           type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
   </data>
  1. ঘুমের মানের ছয়টি ছবির প্রতিটির জন্য, নিচের মত একটি ক্লিক হ্যান্ডলার যোগ করুন। ছবির সাথে মান রেটিং মিলান.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
  1. আপনার প্রকল্প পরিষ্কার এবং পুনর্নির্মাণ. এটি বাঁধাই বস্তুর সাথে কোনো ত্রুটি সমাধান করা উচিত। অন্যথায়, ক্যাশে সাফ করুন ( ফাইল > ক্যাশে বাতিল করুন / পুনঃসূচনা করুন ) এবং আপনার অ্যাপটি পুনরায় তৈরি করুন।

অভিনন্দন! আপনি কোরোটিন ব্যবহার করে একটি সম্পূর্ণ Room ডেটাবেস অ্যাপ তৈরি করেছেন।

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

এই শেষ কাজটিতে, আপনি বোতামের দৃশ্যমানতা পরিচালনা করতে রূপান্তর মানচিত্র ব্যবহার করতে শিখবেন যাতে ব্যবহারকারীরা শুধুমাত্র সঠিক পছন্দ করতে পারে। সমস্ত ডেটা সাফ হয়ে যাওয়ার পরে আপনি একটি বন্ধুত্বপূর্ণ বার্তা প্রদর্শন করতে অনুরূপ পদ্ধতি ব্যবহার করতে পারেন।

ধাপ 1: আপডেট বোতাম রাষ্ট্র

ধারণাটি হল বোতামের অবস্থা সেট করা যাতে শুরুতে শুধুমাত্র স্টার্ট বোতামটি সক্রিয় থাকে, যার মানে এটি ক্লিকযোগ্য।

ব্যবহারকারী স্টার্ট ট্যাপ করার পরে, স্টপ বোতামটি সক্রিয় হয়ে যায় এবং শুরু হয় না। ক্লিয়ার বোতামটি তখনই সক্রিয় হয় যখন ডাটাবেসে ডেটা থাকে।

  1. fragment_sleep_tracker.xml লেআউট ফাইলটি খুলুন।
  2. প্রতিটি বোতামে android:enabled প্রপার্টি যোগ করুন। android:enabled প্রপার্টি হল একটি বুলিয়ান মান যা নির্দেশ করে বোতামটি সক্ষম কিনা। (একটি সক্ষম বোতাম ট্যাপ করা যেতে পারে; একটি নিষ্ক্রিয় বোতাম পারে না।) সম্পত্তিটিকে একটি স্টেট ভেরিয়েবলের মান দিন যা আপনি এক মুহূর্তের মধ্যে সংজ্ঞায়িত করবেন।

start_button :

android:enabled="@{sleepTrackerViewModel.startButtonVisible}"

stop_button :

android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"

clear_button :

android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"
  1. SleepTrackerViewModel খুলুন এবং তিনটি সংশ্লিষ্ট ভেরিয়েবল তৈরি করুন। প্রতিটি ভেরিয়েবলকে একটি রূপান্তর বরাদ্দ করুন যা এটি পরীক্ষা করে।
  • tonight null হলে স্টার্ট বোতামটি সক্রিয় করা উচিত।
  • tonight null না হলে স্টপ বোতামটি সক্রিয় করা উচিত।
  • ক্লিয়ার বোতামটি কেবল তখনই সক্রিয় করা উচিত যদি nights , এবং এইভাবে ডাটাবেসে, ঘুমের রাতগুলি থাকে৷
val startButtonVisible = Transformations.map(tonight) {
   it == null
}
val stopButtonVisible = Transformations.map(tonight) {
   it != null
}
val clearButtonVisible = Transformations.map(nights) {
   it?.isNotEmpty()
}
  1. আপনার অ্যাপটি চালান এবং বোতামগুলির সাথে পরীক্ষা করুন৷

ধাপ 2: ব্যবহারকারীকে জানানোর জন্য একটি স্ন্যাকবার ব্যবহার করুন

ব্যবহারকারী ডাটাবেস সাফ করার পরে, ব্যবহারকারীকে Snackbar উইজেট ব্যবহার করে একটি নিশ্চিতকরণ দেখান। একটি স্ন্যাকবার স্ক্রিনের নীচে একটি বার্তার মাধ্যমে একটি অপারেশন সম্পর্কে সংক্ষিপ্ত প্রতিক্রিয়া প্রদান করে। একটি স্ন্যাকবার একটি সময় শেষ হওয়ার পরে, স্ক্রিনের অন্য কোথাও ব্যবহারকারীর ইন্টারঅ্যাকশনের পরে বা ব্যবহারকারী স্ন্যাকবারটি স্ক্রীন থেকে সোয়াইপ করার পরে অদৃশ্য হয়ে যায়৷

স্ন্যাকবার দেখানো একটি UI টাস্ক, এবং এটি টুকরো টুকরো হওয়া উচিত। ViewModel-এ ViewModel দেখানোর সিদ্ধান্ত নেওয়া হয়। ডেটা সাফ হয়ে গেলে স্ন্যাকবার সেট আপ এবং ট্রিগার করতে, আপনি নেভিগেশন ট্রিগার করার মতো একই কৌশল ব্যবহার করতে পারেন।

  1. SleepTrackerViewModel এ, এনক্যাপসুলেটেড ইভেন্ট তৈরি করুন।
private var _showSnackbarEvent = MutableLiveData<Boolean>()

val showSnackBarEvent: LiveData<Boolean>
   get() = _showSnackbarEvent
  1. তারপর সম্পন্ন করা doneShowingSnackbar() বাস্তবায়ন করুন।
fun doneShowingSnackbar() {
   _showSnackbarEvent.value = false
}
  1. SleepTrackerFragment এ, onCreateView() এ, একজন পর্যবেক্ষক যোগ করুন:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })
  1. পর্যবেক্ষক ব্লকের ভিতরে, স্ন্যাকবার প্রদর্শন করুন এবং অবিলম্বে ইভেন্টটি পুনরায় সেট করুন।
   if (it == true) { // Observed state is true.
       Snackbar.make(
               activity!!.findViewById(android.R.id.content),
               getString(R.string.cleared_message),
               Snackbar.LENGTH_SHORT // How long to display the message.
       ).show()
       sleepTrackerViewModel.doneShowingSnackbar()
   }
  1. SleepTrackerViewModel এ, onClear() পদ্ধতিতে ইভেন্টটি ট্রিগার করুন। এটি করার জন্য, launch ব্লকের ভিতরে ইভেন্টের মান true সেট করুন:
_showSnackbarEvent.value = true
  1. আপনার অ্যাপ তৈরি করুন এবং চালান!

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: TrackMySleepQualityFinal

এই অ্যাপে ঘুমের গুণমান ট্র্যাকিং প্রয়োগ করা একটি নতুন কীতে একটি পরিচিত মিউজিক বাজানোর মতো। বিশদ বিবরণ পরিবর্তিত হলেও, এই পাঠের পূর্ববর্তী কোডল্যাবগুলিতে আপনি যা করেছেন তার অন্তর্নিহিত প্যাটার্নটি একই রয়ে গেছে। এই প্যাটার্নগুলি সম্পর্কে সচেতন হওয়া কোডিংকে আরও দ্রুত করে তোলে, কারণ আপনি বিদ্যমান অ্যাপ থেকে কোড পুনরায় ব্যবহার করতে পারেন। এই কোর্সে এখন পর্যন্ত ব্যবহৃত কিছু নিদর্শন এখানে দেওয়া হল:

  • একটি ViewModel এবং একটি ViewModelFactory তৈরি করুন এবং একটি ডেটা উৎস সেট আপ করুন।
  • ট্রিগার নেভিগেশন. উদ্বেগ আলাদা করতে, ভিউ মডেলে ক্লিক হ্যান্ডলার এবং খণ্ডে নেভিগেশন রাখুন।
  • রাজ্যের পরিবর্তনগুলি ট্র্যাক করতে এবং প্রতিক্রিয়া জানাতে LiveData সহ এনক্যাপসুলেশন ব্যবহার করুন।
  • LiveData দিয়ে রূপান্তর ব্যবহার করুন।
  • একটি সিঙ্গলটন ডাটাবেস তৈরি করুন।
  • ডাটাবেস অপারেশনের জন্য coroutines সেট আপ করুন.

ট্রিগারিং নেভিগেশন

আপনি একটি নেভিগেশন ফাইলের টুকরাগুলির মধ্যে সম্ভাব্য নেভিগেশন পাথগুলি সংজ্ঞায়িত করেন। এক টুকরো থেকে পরবর্তীতে নেভিগেশন ট্রিগার করার কিছু ভিন্ন উপায় আছে। এর মধ্যে রয়েছে:

  • একটি গন্তব্য অংশে নেভিগেশন ট্রিগার করতে onClick হ্যান্ডলারের সংজ্ঞা দিন।
  • বিকল্পভাবে, এক টুকরো থেকে পরবর্তীতে নেভিগেশন সক্ষম করতে:
  • নেভিগেশন ঘটতে হবে যদি রেকর্ড করতে একটি LiveData মান সংজ্ঞায়িত করুন।
  • সেই LiveData একজন পর্যবেক্ষক সংযুক্ত করুন।
  • আপনার কোড তারপর সেই মান পরিবর্তন করে যখনই নেভিগেশন ট্রিগার করার প্রয়োজন হয় বা সম্পূর্ণ হয়।

android:enabled অ্যাট্রিবিউট সেট করা হচ্ছে

  • android:enabled অ্যাট্রিবিউটটি TextView এ সংজ্ঞায়িত করা হয়েছে এবং Button সহ সমস্ত সাবক্লাস দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায়।
  • android:enabled অ্যাট্রিবিউট নির্ধারণ করে যে একটি View সক্ষম কিনা। "সক্ষম" এর অর্থ সাবক্লাস অনুসারে পরিবর্তিত হয়। উদাহরণস্বরূপ, একটি অ-সক্ষম EditText ব্যবহারকারীকে অন্তর্ভুক্ত পাঠ্য সম্পাদনা করতে বাধা দেয় এবং একটি অ-সক্ষম Button ব্যবহারকারীকে বোতামটি ট্যাপ করা থেকে বাধা দেয়।
  • enabled বৈশিষ্ট্যটি visibility বৈশিষ্ট্যের মতো নয়৷
  • আপনি অন্য বস্তু বা ভেরিয়েবলের অবস্থার উপর ভিত্তি করে বোতামগুলির enabled বৈশিষ্ট্যের মান সেট করতে রূপান্তর মানচিত্র ব্যবহার করতে পারেন।

এই কোডল্যাবে কভার করা অন্যান্য পয়েন্ট:

  • ব্যবহারকারীর কাছে বিজ্ঞপ্তি ট্রিগার করতে, আপনি নেভিগেশন ট্রিগার করার জন্য যে কৌশলটি ব্যবহার করেন আপনি একই কৌশল ব্যবহার করতে পারেন।
  • ব্যবহারকারীকে জানানোর জন্য আপনি একটি Snackbar ব্যবহার করতে পারেন।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

আপনার অ্যাপকে এক টুকরো থেকে পরবর্তীতে নেভিগেশন ট্রিগার করতে সক্ষম করার একটি উপায় হল নেভিগেশন ট্রিগার করা হবে কি না তা নির্দেশ করার জন্য একটি LiveData মান ব্যবহার করা।

একটি LiveData মান ব্যবহার করার পদক্ষেপগুলি কী, যাকে gotoBlueFragment বলা হয়, লাল খণ্ড থেকে নীল খণ্ডে নেভিগেশন ট্রিগার করতে? প্রযোজ্য সমস্ত নির্বাচন করুন:

  • ViewModel এ, LiveData মান gotoBlueFragment সংজ্ঞায়িত করুন।
  • RedFragment এ, gotoBlueFragment মান পর্যবেক্ষণ করুন। উপযুক্ত হলে BlueFragment এ নেভিগেট করতে observe{} কোডটি প্রয়োগ করুন, এবং তারপর নেভিগেশন সম্পূর্ণ হয়েছে তা নির্দেশ করতে gotoBlueFragment এর মান পুনরায় সেট করুন।
  • নিশ্চিত করুন যে আপনার কোডটি gotoBlueFragment ভেরিয়েবলটিকে সেই মানটিতে সেট করে যা যখনই অ্যাপটিকে BlueFragment থেকে RedFragment এ যেতে হবে তখন নেভিগেশন ট্রিগার করে৷
  • নিশ্চিত করুন যে আপনার কোডটি BlueFragment জন্য একটি onClick হ্যান্ডলারকে সংজ্ঞায়িত করে যা ব্যবহারকারী View এ নেভিগেট করতে ক্লিক করে, যেখানে onClick হ্যান্ডলার goToBlueFragment মান পর্যবেক্ষণ করে৷

প্রশ্ন 2

আপনি LiveData ব্যবহার করে একটি Button সক্রিয় (ক্লিকযোগ্য) কিনা তা পরিবর্তন করতে পারেন। আপনি কীভাবে নিশ্চিত করবেন যে আপনার অ্যাপ UpdateNumber বোতামটি পরিবর্তন করে যাতে:

  • myNumber এর মান 5-এর বেশি হলে বোতামটি সক্রিয় করা হয়।
  • myNumber 5 এর সমান বা তার কম হলে বোতামটি সক্রিয় হয় না।

ধরে নিন যে UpdateNumber বোতামটি রয়েছে তাতে NumbersViewModel এর জন্য <data> ভেরিয়েবল এখানে দেখানো হয়েছে:

<data>
   <variable
       name="NumbersViewModel"
       type="com.example.android.numbersapp.NumbersViewModel" />
</data>

অনুমান করুন যে লেআউট ফাইলের বোতামের আইডি নিম্নলিখিত:

android:id="@+id/update_number_button"

আর কি করতে হবে? প্রযোজ্য সব নির্বাচন করুন.

  • NumbersViewModel ক্লাসে, একটি LiveData ভেরিয়েবল সংজ্ঞায়িত করুন, myNumber , যা সংখ্যাটিকে উপস্থাপন করে। এছাড়াও একটি ভেরিয়েবলকে সংজ্ঞায়িত করুন যার মান myNumber ভেরিয়েবলে Transform.map() কল করে সেট করা হয়েছে, যা একটি বুলিয়ান প্রদান করে যা নির্দেশ করে যে সংখ্যাটি 5-এর বেশি কিনা।

    বিশেষ করে, ViewModel এ, নিম্নলিখিত কোড যোগ করুন:
val myNumber: LiveData<Int>

val enableUpdateNumberButton = Transformations.map(myNumber) {
   myNumber > 5
}
  • XML লেআউটে, update_number_button button android:enabled বৈশিষ্ট্যটি NumberViewModel.enableUpdateNumbersButton এ সেট করুন।
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
  • Fragment যেটি NumbersViewModel ক্লাস ব্যবহার করে, তাতে বোতামের enabled বৈশিষ্ট্যে একজন পর্যবেক্ষক যোগ করুন।

    বিশেষত, Fragment , নিম্নলিখিত কোড যোগ করুন:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
   myNumber > 5
})
  • লেআউট ফাইলে, update_number_button button android:enabled অ্যাট্রিবিউটটিকে "Observable" এ সেট করুন।

পরবর্তী পাঠ শুরু করুন: 7.1 রিসাইক্লারভিউ মৌলিক

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।