এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।
ভূমিকা
এই কোডল্যাবটি নেভিগেশন বাস্তবায়নের জন্য ViewModel এবং টুকরোগুলিকে একসাথে কীভাবে ব্যবহার করতে হয় তা বর্ণনা করে। মনে রাখবেন যে লক্ষ্য হল ViewModel এ কখন নেভিগেট করতে হবে তার যুক্তি দেওয়া, কিন্তু টুকরো এবং নেভিগেশন ফাইলের পাথগুলি সংজ্ঞায়িত করা। এই লক্ষ্য অর্জন করতে, আপনি ভিউ মডেল, টুকরো, LiveData এবং পর্যবেক্ষক ব্যবহার করেন।
কোডল্যাবটি ন্যূনতম কোড সহ বোতামের অবস্থাগুলিকে ট্র্যাক করার একটি চতুর উপায় দেখিয়ে শেষ করে, যাতে প্রতিটি বোতাম সক্ষম হয় এবং ক্লিক করা যায় শুধুমাত্র তখনই যখন ব্যবহারকারীর পক্ষে সেই বোতামটি আলতো চাপানো বোঝা যায়।
আপনি ইতিমধ্যে কি জানা উচিত
আপনার সাথে পরিচিত হওয়া উচিত:
- একটি ক্রিয়াকলাপ, টুকরো এবং দৃশ্য ব্যবহার করে একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা।
- টুকরোগুলির মধ্যে নেভিগেট করা এবং খণ্ডগুলির মধ্যে ডেটা পাস করতে
safeArgsব্যবহার করে৷ - মডেল দেখুন, মডেল কারখানা, রূপান্তর, এবং
LiveDataএবং তাদের পর্যবেক্ষক দেখুন। - কিভাবে একটি
Roomডাটাবেস তৈরি করতে হয়, একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) তৈরি করতে হয় এবং সত্তাকে সংজ্ঞায়িত করতে হয়। - ডাটাবেস মিথস্ক্রিয়া এবং অন্যান্য দীর্ঘ-চলমান কাজের জন্য কোরোটিনগুলি কীভাবে ব্যবহার করবেন।
আপনি কি শিখবেন
- ডাটাবেসে বিদ্যমান ঘুমের মানের রেকর্ড কীভাবে আপডেট করবেন।
- বোতামের অবস্থা ট্র্যাক করতে কিভাবে
LiveDataব্যবহার করবেন। - একটি ইভেন্টের প্রতিক্রিয়া হিসাবে একটি স্ন্যাকবার কীভাবে প্রদর্শন করবেন।
আপনি কি করবেন
- একটি গুণমানের রেটিং সংগ্রহ করতে, ডাটাবেসে রেটিং যোগ করতে এবং ফলাফল প্রদর্শন করতে TrackMySleepQuality অ্যাপটি প্রসারিত করুন।
- একটি স্ন্যাকবারের প্রদর্শন ট্রিগার করতে
LiveDataব্যবহার করুন। - বোতাম সক্রিয় এবং নিষ্ক্রিয় করতে
LiveDataব্যবহার করুন।
এই কোডল্যাবে, আপনি ঘুমের মানের রেকর্ডিং এবং TrackMySleepQuality অ্যাপের চূড়ান্ত UI তৈরি করেন।
অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়েছে, যেমনটি নীচের চিত্রে দেখানো হয়েছে।
বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার জন্য বোতাম রয়েছে৷ স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটা দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে।
দ্বিতীয় স্ক্রীন, ডানদিকে দেখানো হয়েছে, ঘুমের মানের রেটিং নির্বাচন করার জন্য। অ্যাপে, রেটিংটি সংখ্যাগতভাবে উপস্থাপন করা হয়। বিকাশের উদ্দেশ্যে, অ্যাপটি মুখের আইকন এবং তাদের সংখ্যাসূচক সমতুল্য উভয়ই দেখায়।
ব্যবহারকারীর প্রবাহ নিম্নরূপ:
- ব্যবহারকারী অ্যাপটি খোলে এবং স্লিপ-ট্র্যাকিং স্ক্রিন দিয়ে উপস্থাপিত হয়।
- ব্যবহারকারী স্টার্ট বোতামে ট্যাপ করে। এটি শুরুর সময় রেকর্ড করে এবং এটি প্রদর্শন করে। স্টার্ট বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টপ বোতামটি সক্রিয় করা হয়েছে।
- ব্যবহারকারী স্টপ বোতামে ট্যাপ করে। এটি শেষের সময় রেকর্ড করে এবং ঘুমের মানের স্ক্রিন খোলে।
- ব্যবহারকারী একটি ঘুমের মানের আইকন নির্বাচন করে। স্ক্রিন বন্ধ হয়ে যায়, এবং ট্র্যাকিং স্ক্রীন ঘুমের শেষ সময় এবং ঘুমের গুণমান প্রদর্শন করে। স্টপ বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টার্ট বোতামটি সক্ষম করা হয়েছে। অ্যাপটি অন্য রাতের জন্য প্রস্তুত।
- যখনই ডাটাবেসে ডেটা থাকে তখন ক্লিয়ার বোতামটি সক্রিয় থাকে। ব্যবহারকারী যখন ক্লিয়ার বোতামে আলতো চাপেন, তখন তাদের সমস্ত ডেটা অবলম্বন ছাড়াই মুছে ফেলা হয় — সেখানে "আপনি কি নিশ্চিত?" বার্তা
এই অ্যাপটি একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে, যেমনটি সম্পূর্ণ আর্কিটেকচারের প্রসঙ্গে নীচে দেখানো হয়েছে। অ্যাপ্লিকেশন শুধুমাত্র নিম্নলিখিত উপাদান ব্যবহার করে:
- UI কন্ট্রোলার
- মডেল এবং
LiveDataদেখুন - একটি রুম ডাটাবেস
এই কোডল্যাব ধরে নেয় যে আপনি জানেন কিভাবে টুকরো এবং নেভিগেশন ফাইল ব্যবহার করে নেভিগেশন বাস্তবায়ন করতে হয়। আপনার কাজ বাঁচাতে, এই কোডের একটি ভাল চুক্তি প্রদান করা হয়েছে।
ধাপ 1: কোড পরিদর্শন করুন
- শুরু করতে, শেষ কোডল্যাবের শেষ থেকে আপনার নিজের কোড দিয়ে চালিয়ে যান, অথবা স্টার্টার কোডটি ডাউনলোড করুন।
- আপনার স্টার্টার কোডে,
SleepQualityFragmentপরিদর্শন করুন। এই ক্লাসটি লেআউটকে স্ফীত করে, অ্যাপ্লিকেশন পায় এবংbinding.rootপ্রদান করে। - ডিজাইন এডিটরে navigation.xml খুলুন। আপনি দেখতে পাচ্ছেন যে
SleepTrackerFragmentথেকেSleepQualityFragmentএবং আবারSleepQualityFragmentথেকেSleepTrackerFragmentএ একটি নেভিগেশন পথ রয়েছে।
- navigation.xml এর জন্য কোড পরিদর্শন করুন। বিশেষ করে,
sleepNightKeyনামের<argument>আর্গুমেন্ট> সন্ধান করুন ।
ব্যবহারকারী যখনSleepTrackerFragmentথেকেSleepQualityFragment,অ্যাপটি সেই রাতের জন্যSleepQualityFragmentএ একটিsleepNightKeyপাঠাবে যা আপডেট করতে হবে।
ধাপ 2: ঘুমের মানের ট্র্যাকিংয়ের জন্য নেভিগেশন যোগ করুন
নেভিগেশন গ্রাফে ইতিমধ্যেই SleepTrackerFragment থেকে SleepQualityFragment এবং আবার ফিরে যাওয়ার পথগুলি অন্তর্ভুক্ত রয়েছে৷ যাইহোক, যে ক্লিক হ্যান্ডলারগুলি এক টুকরো থেকে পরবর্তীতে নেভিগেশন বাস্তবায়ন করে সেগুলি এখনও কোড করা হয়নি। আপনি এখন সেই কোডটি ViewModel এ যোগ করুন।
ক্লিক হ্যান্ডলারে, আপনি একটি LiveData সেট করেন যা পরিবর্তিত হয় যখন আপনি অ্যাপটিকে একটি ভিন্ন গন্তব্যে নেভিগেট করতে চান। খণ্ডটি এই LiveData পর্যবেক্ষণ করে। যখন ডেটা পরিবর্তন হয়, খণ্ডটি গন্তব্যে নেভিগেট করে এবং ভিউ মডেলকে বলে যে এটি হয়ে গেছে, যা স্টেট ভেরিয়েবল রিসেট করে।
-
SleepTrackerViewModelখুলুন। আপনাকে নেভিগেশন যোগ করতে হবে যাতে ব্যবহারকারী যখন স্টপ বোতামে ট্যাপ করে, অ্যাপটি একটি গুণমানের রেটিং সংগ্রহ করতেSleepQualityFragmentএ নেভিগেট করে। -
SleepTrackerViewModelএ, একটিLiveDataতৈরি করুন যা পরিবর্তন হয় যখন আপনি অ্যাপটিকেSleepQualityFragmentএ নেভিগেট করতে চান।ViewModelএLiveDataএর একটি পেতেযোগ্য সংস্করণ প্রকাশ করতে encapsulation ব্যবহার করুন।
আপনি এই কোডটি ক্লাস বডির শীর্ষ স্তরের যে কোনও জায়গায় রাখতে পারেন।
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()
val navigateToSleepQuality: LiveData<SleepNight>
get() = _navigateToSleepQuality- একটি
doneNavigating()ফাংশন যোগ করুন যা ভেরিয়েবল রিসেট করে যা নেভিগেশন ট্রিগার করে।
fun doneNavigating() {
_navigateToSleepQuality.value = null
}- স্টপ বোতামের জন্য ক্লিক হ্যান্ডলারে,
onStopTracking(),SleepQualityFragmentএ নেভিগেশন ট্রিগার করুন।launch{}ব্লকের ভিতরে শেষ জিনিস হিসাবে ফাংশনের শেষে _navigateToSleepQualityভেরিয়েবল সেট করুন। মনে রাখবেন যে এই পরিবর্তনশীলটিnightজন্য সেট করা হয়েছে। যখন এই ভেরিয়েবলের একটি মান থাকে, অ্যাপটিSleepQualityFragmentনেভিগেট করে, রাত পেরিয়ে যায়।
_navigateToSleepQuality.value = oldNight-
SleepTrackerFragmentকে _navigateToSleepQualityপর্যবেক্ষণ করতে হবে যাতে অ্যাপটি কখন নেভিগেট করতে পারে তা জানতে পারে।SleepTrackerFragmentএ,onCreateView()এ,navigateToSleepQuality()এর জন্য একজন পর্যবেক্ষক যোগ করুন। মনে রাখবেন যে এটির জন্য আমদানি অস্পষ্ট এবং আপনাকেandroidx.lifecycle.Observerআমদানি করতে হবে।
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})
- পর্যবেক্ষক ব্লকের ভিতরে, নেভিগেট করুন এবং বর্তমান রাতের আইডি বরাবর পাস করুন, এবং তারপর
doneNavigating()কল করুন। আপনার আমদানি অস্পষ্ট হলে,androidx.navigation.fragment.findNavControllerআমদানি করুন।
night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
sleepTrackerViewModel.doneNavigating()
}- আপনার অ্যাপ তৈরি করুন এবং চালান। শুরুতে আলতো চাপুন, তারপরে থামুন আলতো চাপুন , যা আপনাকে
SleepQualityFragmentস্ক্রিনে নিয়ে যাবে। ফিরে পেতে, সিস্টেম ব্যাক বোতামটি ব্যবহার করুন।
এই টাস্কে, আপনি ঘুমের গুণমান রেকর্ড করুন এবং স্লিপ ট্র্যাকারের অংশে ফিরে যান। ব্যবহারকারীকে আপডেট করা মান দেখানোর জন্য ডিসপ্লে স্বয়ংক্রিয়ভাবে আপডেট হওয়া উচিত। আপনাকে একটি ViewModel এবং একটি ViewModelFactory তৈরি করতে হবে এবং আপনাকে SleepQualityFragment আপডেট করতে হবে।
ধাপ 1: একটি ViewModel এবং একটি ViewModelFactory তৈরি করুন
-
sleepqualityপ্যাকেজে, SleepQualityViewModel.kt তৈরি বা খুলুন। - একটি
SleepQualityViewModelক্লাস তৈরি করুন যা একটিsleepNightKeyএবং ডাটাবেসকে আর্গুমেন্ট হিসাবে নেয়। ঠিক যেমন আপনিSleepTrackerViewModelএর জন্য করেছেন, আপনাকে ফ্যাক্টরি থেকেdatabaseপাস করতে হবে। আপনাকে নেভিগেশন থেকেsleepNightKeyপাস করতে হবে।
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}-
SleepQualityViewModelক্লাসের ভিতরে, একটিJobএবংuiScopeসংজ্ঞায়িত করুন এবংonCleared()ওভাররাইড করুন।
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}- উপরের মত একই প্যাটার্ন ব্যবহার করে
SleepTrackerFragmentএ ফিরে যেতে,_navigateToSleepTrackerঘোষণা করুন।navigateToSleepTrackerএবংdoneNavigating()প্রয়োগ করুন।
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()
val navigateToSleepTracker: LiveData<Boolean?>
get() = _navigateToSleepTracker
fun doneNavigating() {
_navigateToSleepTracker.value = null
}- একটি ক্লিক হ্যান্ডলার তৈরি করুন,
onSetSleepQuality(), সমস্ত ঘুম-গুণমানের চিত্র ব্যবহারের জন্য।
পূর্ববর্তী কোডল্যাবের মতো একই কোরোটিন প্যাটার্ন ব্যবহার করুন:
-
uiScopeএ একটি coroutine চালু করুন এবং 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
}
}-
sleepqualityপ্যাকেজে,SleepQualityViewModelFactory.ktতৈরি করুন বা খুলুন এবং নীচে দেখানো হিসাবেSleepQualityViewModelFactoryক্লাস যোগ করুন। এই ক্লাসটি আপনি আগে দেখেছেন একই বয়লারপ্লেট কোডের একটি সংস্করণ ব্যবহার করে। আপনি এগিয়ে যাওয়ার আগে কোডটি পরীক্ষা করুন।
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 আপডেট করুন
-
SleepQualityFragment.ktখুলুন। -
onCreateView()এ, আপনিapplicationপাওয়ার পরে, আপনাকে নেভিগেশনের সাথে আসাargumentsপেতে হবে। এই আর্গুমেন্টগুলিSleepQualityFragmentArgsএ রয়েছে। আপনি বান্ডিল থেকে তাদের নিষ্কাশন করা প্রয়োজন.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)- এর পরে,
dataSourceপান।
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao-
dataSourceএবংsleepNightKeyপাস করে একটি কারখানা তৈরি করুন।
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)- একটি
ViewModelরেফারেন্স পান।
val sleepQualityViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepQualityViewModel::class.java)- বাইন্ডিং অবজেক্টে
ViewModelযোগ করুন। (যদি আপনি বাইন্ডিং অবজেক্টের সাথে একটি ত্রুটি দেখতে পান তবে আপাতত এটি উপেক্ষা করুন।)
binding.sleepQualityViewModel = sleepQualityViewModel- পর্যবেক্ষক যোগ করুন। অনুরোধ করা হলে,
androidx.lifecycle.Observerআমদানি করুন।
sleepQualityViewModel.navigateToSleepTracker.observe(this, Observer {
if (it == true) { // Observed state is true.
this.findNavController().navigate(
SleepQualityFragmentDirections.actionSleepQualityFragmentToSleepTrackerFragment())
sleepQualityViewModel.doneNavigating()
}
})ধাপ 3: লেআউট ফাইলটি আপডেট করুন এবং অ্যাপটি চালান
-
fragment_sleep_quality.xmlলেআউট ফাইলটি খুলুন।<data>ব্লকে,SleepQualityViewModelএর জন্য একটি ভেরিয়েবল যোগ করুন।
<data>
<variable
name="sleepQualityViewModel"
type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
</data>- ঘুমের মানের ছয়টি ছবির প্রতিটির জন্য, নিচের মত একটি ক্লিক হ্যান্ডলার যোগ করুন। ছবির সাথে মান রেটিং মিলান.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"- আপনার প্রকল্প পরিষ্কার এবং পুনর্নির্মাণ. এটি বাঁধাই বস্তুর সাথে কোনো ত্রুটি সমাধান করা উচিত। অন্যথায়, ক্যাশে সাফ করুন ( ফাইল > ক্যাশে বাতিল করুন / পুনঃসূচনা করুন ) এবং আপনার অ্যাপটি পুনরায় তৈরি করুন।
অভিনন্দন! আপনি কোরোটিন ব্যবহার করে একটি সম্পূর্ণ Room ডেটাবেস অ্যাপ তৈরি করেছেন।
এখন আপনার অ্যাপটি দুর্দান্ত কাজ করে। ব্যবহারকারী যতবার চান ততবার স্টার্ট এবং স্টপ ট্যাপ করতে পারেন। যখন ব্যবহারকারী থামুন ট্যাপ করে, তখন তারা ঘুমের গুণমান প্রবেশ করতে পারে। ব্যবহারকারী সাফ আলতো চাপলে, সমস্ত ডেটা পটভূমিতে নীরবে সাফ হয়ে যায়। যাইহোক, সমস্ত বোতামগুলি সর্বদা সক্রিয় এবং ক্লিকযোগ্য, যা অ্যাপটি ভেঙে দেয় না, তবে এটি ব্যবহারকারীদের অসম্পূর্ণ ঘুমের রাত তৈরি করতে দেয়।
এই শেষ কাজটিতে, আপনি বোতামের দৃশ্যমানতা পরিচালনা করতে রূপান্তর মানচিত্র ব্যবহার করতে শিখবেন যাতে ব্যবহারকারীরা শুধুমাত্র সঠিক পছন্দ করতে পারে। সমস্ত ডেটা সাফ হয়ে যাওয়ার পরে আপনি একটি বন্ধুত্বপূর্ণ বার্তা প্রদর্শন করতে অনুরূপ পদ্ধতি ব্যবহার করতে পারেন।
ধাপ 1: আপডেট বোতাম রাষ্ট্র
ধারণাটি হল বোতামের অবস্থা সেট করা যাতে শুরুতে শুধুমাত্র স্টার্ট বোতামটি সক্রিয় থাকে, যার মানে এটি ক্লিকযোগ্য।
ব্যবহারকারী স্টার্ট ট্যাপ করার পরে, স্টপ বোতামটি সক্রিয় হয়ে যায় এবং শুরু হয় না। ক্লিয়ার বোতামটি তখনই সক্রিয় হয় যখন ডাটাবেসে ডেটা থাকে।
-
fragment_sleep_tracker.xmlলেআউট ফাইলটি খুলুন। - প্রতিটি বোতামে
android:enabledপ্রপার্টি যোগ করুন।android:enabledপ্রপার্টি হল একটি বুলিয়ান মান যা নির্দেশ করে বোতামটি সক্ষম কিনা। (একটি সক্ষম বোতাম ট্যাপ করা যেতে পারে; একটি নিষ্ক্রিয় বোতাম পারে না।) সম্পত্তিটিকে একটি স্টেট ভেরিয়েবলের মান দিন যা আপনি এক মুহূর্তের মধ্যে সংজ্ঞায়িত করবেন।
start_button :
android:enabled="@{sleepTrackerViewModel.startButtonVisible}"stop_button :
android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"clear_button :
android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"-
SleepTrackerViewModelখুলুন এবং তিনটি সংশ্লিষ্ট ভেরিয়েবল তৈরি করুন। প্রতিটি ভেরিয়েবলকে একটি রূপান্তর বরাদ্দ করুন যা এটি পরীক্ষা করে।
-
tonightnullহলে স্টার্ট বোতামটি সক্রিয় করা উচিত। -
tonightnullনা হলে স্টপ বোতামটি সক্রিয় করা উচিত। - ক্লিয়ার বোতামটি কেবল তখনই সক্রিয় করা উচিত যদি
nights, এবং এইভাবে ডাটাবেসে ঘুমের রাতগুলি থাকে৷
val startButtonVisible = Transformations.map(tonight) {
it == null
}
val stopButtonVisible = Transformations.map(tonight) {
it != null
}
val clearButtonVisible = Transformations.map(nights) {
it?.isNotEmpty()
}- আপনার অ্যাপটি চালান এবং বোতামগুলির সাথে পরীক্ষা করুন৷
ধাপ 2: ব্যবহারকারীকে জানানোর জন্য একটি স্ন্যাকবার ব্যবহার করুন
ব্যবহারকারী ডাটাবেস সাফ করার পরে, ব্যবহারকারীকে Snackbar উইজেট ব্যবহার করে একটি নিশ্চিতকরণ দেখান। একটি স্ন্যাকবার স্ক্রিনের নীচে একটি বার্তার মাধ্যমে একটি অপারেশন সম্পর্কে সংক্ষিপ্ত প্রতিক্রিয়া প্রদান করে। একটি স্ন্যাকবার একটি সময় শেষ হওয়ার পরে, স্ক্রিনের অন্য কোথাও ব্যবহারকারীর ইন্টারঅ্যাকশনের পরে বা ব্যবহারকারী স্ন্যাকবারটি স্ক্রীন থেকে সোয়াইপ করার পরে অদৃশ্য হয়ে যায়।
স্ন্যাকবার দেখানো একটি UI টাস্ক, এবং এটি টুকরো টুকরো হওয়া উচিত। ViewModel এ স্ন্যাকবার দেখানোর সিদ্ধান্ত নেওয়া হয়। ডেটা সাফ হয়ে গেলে স্ন্যাকবার সেট আপ এবং ট্রিগার করতে, আপনি নেভিগেশন ট্রিগার করার মতো একই কৌশল ব্যবহার করতে পারেন।
-
SleepTrackerViewModelএ, এনক্যাপসুলেটেড ইভেন্ট তৈরি করুন।
private var _showSnackbarEvent = MutableLiveData<Boolean>()
val showSnackBarEvent: LiveData<Boolean>
get() = _showSnackbarEvent- তারপর
doneShowingSnackbar()বাস্তবায়ন করুন।
fun doneShowingSnackbar() {
_showSnackbarEvent.value = false
}-
SleepTrackerFragmentএ,onCreateView()এ, একজন পর্যবেক্ষক যোগ করুন:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })- পর্যবেক্ষক ব্লকের ভিতরে, স্ন্যাকবার প্রদর্শন করুন এবং অবিলম্বে ইভেন্টটি পুনরায় সেট করুন।
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()
}-
SleepTrackerViewModelএ,onClear()পদ্ধতিতে ইভেন্টটিকে ট্রিগার করুন। এটি করার জন্য,launchব্লকের ভিতরে ইভেন্টের মানtrueসেট করুন:
_showSnackbarEvent.value = true- আপনার অ্যাপ তৈরি করুন এবং চালান!
অ্যান্ড্রয়েড স্টুডিও প্রকল্প: TrackMySleepQualityFinal
এই অ্যাপে ঘুমের গুণমান ট্র্যাকিং প্রয়োগ করা একটি নতুন কীতে একটি পরিচিত মিউজিক বাজানোর মতো। বিশদ বিবরণ পরিবর্তিত হওয়ার সময়, এই পাঠের পূর্ববর্তী কোডল্যাবগুলিতে আপনি যা করেছেন তার অন্তর্নিহিত প্যাটার্ন একই রয়ে গেছে। এই প্যাটার্নগুলি সম্পর্কে সচেতন হওয়া কোডিংকে আরও দ্রুত করে তোলে, কারণ আপনি বিদ্যমান অ্যাপ থেকে কোড পুনরায় ব্যবহার করতে পারেন। এই কোর্সে এখন পর্যন্ত ব্যবহৃত কিছু নিদর্শন এখানে দেওয়া হল:
- একটি
ViewModelএবং একটিViewModelFactoryতৈরি করুন এবং একটি ডেটা উৎস সেট আপ করুন। - ট্রিগার নেভিগেশন. উদ্বেগগুলি আলাদা করতে, ভিউ মডেলে ক্লিক হ্যান্ডলার এবং খণ্ডে নেভিগেশন রাখুন।
- রাজ্যের পরিবর্তনগুলি ট্র্যাক করতে এবং প্রতিক্রিয়া জানাতে
LiveDataসহ এনক্যাপসুলেশন ব্যবহার করুন। -
LiveDataদিয়ে রূপান্তর ব্যবহার করুন। - একটি সিঙ্গলটন ডাটাবেস তৈরি করুন।
- ডাটাবেস অপারেশনের জন্য কোরোটিন সেট আপ করুন।
ট্রিগারিং নেভিগেশন
আপনি একটি নেভিগেশন ফাইলের টুকরোগুলির মধ্যে সম্ভাব্য নেভিগেশন পাথগুলি সংজ্ঞায়িত করেন। এক টুকরো থেকে পরবর্তীতে নেভিগেশন ট্রিগার করার কিছু ভিন্ন উপায় আছে। এর মধ্যে রয়েছে:
- একটি গন্তব্য খণ্ডে নেভিগেশন ট্রিগার করতে
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ভেরিয়েবলটিকে সেই মানটিতে সেট করে যা যখনই অ্যাপটিকেRedFragmentথেকেBlueFragmentএ যেতে হবে তখন নেভিগেশন ট্রিগার করে৷ - নিশ্চিত করুন যে আপনার কোডটি
Viewজন্য একটিonClickহ্যান্ডলারকে সংজ্ঞায়িত করে যা ব্যবহারকারীBlueFragmentএ নেভিগেট করতে ক্লিক করে, যেখানেonClickহ্যান্ডলারgoToBlueFragmentমান পর্যবেক্ষণ করে৷
প্রশ্ন 2
আপনি LiveData ব্যবহার করে একটি Button সক্ষম (ক্লিকযোগ্য) কিনা তা পরিবর্তন করতে পারেন। আপনি কীভাবে নিশ্চিত করবেন যে আপনার অ্যাপ UpdateNumber বোতামটি পরিবর্তন করে যাতে:
- যদি
myNumberমান 5-এর বেশি থাকে তাহলে বোতামটি সক্রিয় থাকে। -
myNumber5 এর সমান বা তার কম হলে বোতামটি সক্রিয় হয় না।
ধরে নিন যে লেআউটটিতে 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 buttonandroid: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 buttonandroid:enabledঅ্যাট্রিবিউটটিকে"Observable"এ সেট করুন।
পরবর্তী পাঠ শুরু করুন:
এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।