این کد لبه بخشی از دوره آموزشی Android Kotlin Fundamentals است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. همه کد لبه های دوره در صفحه فرود کد لبه های Android Kotlin Fundamentals فهرست شده اند.
مقدمه
این لبه کد نحوه استفاده از ViewModel و قطعات را با هم برای پیاده سازی ناوبری خلاصه می کند. به یاد داشته باشید که هدف این است که منطق زمان حرکت را در ViewModel قرار دهید، اما مسیرها را در قطعات و فایل ناوبری تعریف کنید. برای دستیابی به این هدف، از مدلهای مشاهده، قطعات، LiveData و مشاهدهکنندگان استفاده میکنید.
نرم افزار Codelab با نشان دادن روشی هوشمندانه برای ردیابی وضعیت دکمه ها با حداقل کد به پایان می رسد، به طوری که هر دکمه تنها زمانی فعال و قابل کلیک است که برای کاربر منطقی باشد که روی آن دکمه ضربه بزند.
آنچه از قبل باید بدانید
شما باید با این موارد آشنا باشید:
- ساخت یک رابط کاربری اولیه (UI) با استفاده از یک فعالیت، قطعات و نماها.
- پیمایش بین قطعات و استفاده از
safeArgsبرای انتقال داده بین قطعات. - مشاهده مدلها، مشاهده کارخانههای مدل، تبدیلها، و
LiveDataو ناظران آنها. - نحوه ایجاد پایگاه داده
Room، ایجاد یک شی دسترسی به داده (DAO) و تعریف موجودیت ها. - نحوه استفاده از کوروتین ها برای تعاملات پایگاه داده و سایر کارهای طولانی مدت.
چیزی که یاد خواهید گرفت
- چگونه یک رکورد با کیفیت خواب موجود در پایگاه داده را به روز کنیم.
- نحوه استفاده از
LiveDataبرای ردیابی وضعیت دکمه ها. - نحوه نمایش اسنک بار در پاسخ به یک رویداد.
کاری که خواهی کرد
- برنامه TrackMySleepQuality را برای جمع آوری رتبه بندی کیفیت، اضافه کردن رتبه به پایگاه داده و نمایش نتیجه گسترش دهید.
- از
LiveDataبرای فعال کردن نمایش نوار اسنک استفاده کنید. - از
LiveDataبرای فعال و غیرفعال کردن دکمه ها استفاده کنید.
در این لبه کد، ضبط با کیفیت خواب و رابط کاربری نهایی برنامه TrackMySleepQuality را ایجاد می کنید.
این برنامه دارای دو صفحه است که با قطعات نشان داده شده است، همانطور که در شکل زیر نشان داده شده است.
اولین صفحه نمایش داده شده در سمت چپ دارای دکمه هایی برای شروع و توقف ردیابی است. صفحه نمایش تمام داده های خواب کاربر را نشان می دهد. دکمه Clear تمام داده هایی را که برنامه برای کاربر جمع آوری کرده است برای همیشه حذف می کند.
صفحه دوم، نشان داده شده در سمت راست، برای انتخاب رتبه بندی کیفیت خواب است. در برنامه، امتیاز به صورت عددی نشان داده می شود. برای اهداف توسعه، برنامه هم نمادهای چهره و هم معادل های عددی آنها را نشان می دهد.
جریان کاربر به شرح زیر است:
- کاربر برنامه را باز می کند و با صفحه ردیابی خواب نمایش داده می شود.
- کاربر روی دکمه Start ضربه می زند. این زمان شروع را ثبت کرده و نمایش می دهد. دکمه Start غیرفعال است و دکمه Stop فعال است.
- کاربر روی دکمه Stop ضربه می زند. این کار زمان پایان را ثبت می کند و صفحه با کیفیت خواب را باز می کند.
- کاربر یک نماد کیفیت خواب را انتخاب می کند. صفحه بسته می شود و صفحه ردیابی زمان پایان خواب و کیفیت خواب را نشان می دهد. دکمه Stop غیرفعال و دکمه Start فعال است. برنامه برای یک شب دیگر آماده است.
- دکمه Clear هر زمان که داده ای در پایگاه داده وجود داشته باشد فعال می شود. هنگامی که کاربر روی دکمه Clear ضربه میزند، تمام دادههای او بدون مراجعه پاک میشوند - "آیا مطمئن هستید؟" وجود ندارد. پیام
این برنامه از معماری ساده شده استفاده می کند، همانطور که در زیر در زمینه معماری کامل نشان داده شده است. این برنامه فقط از اجزای زیر استفاده می کند:
- کنترلر رابط کاربری
- مشاهده مدل و
LiveData - پایگاه داده اتاق
این کد لبه فرض می کند که شما می دانید چگونه با استفاده از قطعات و فایل ناوبری، ناوبری را پیاده سازی کنید. برای صرفه جویی در کار، مقدار زیادی از این کد ارائه شده است.
مرحله 1: کد را بررسی کنید
- برای شروع، از انتهای آخرین کد لبه کد خود را ادامه دهید یا کد شروع را دانلود کنید.
- در کد شروع،
SleepQualityFragmentبررسی کنید. این کلاس طرح بندی را افزایش می دهد، برنامه را دریافت می کند وbinding.rootبرمی گرداند. - navigation.xml را در ویرایشگر طراحی باز کنید. می بینید که یک مسیر ناوبری از
SleepTrackerFragmentبهSleepQualityFragmentو دوباره ازSleepQualityFragmentبهSleepTrackerFragmentوجود دارد.
- کد navigation.xml را بررسی کنید. به طور خاص، به دنبال
<argument>با نامsleepNightKeyبگردید .
هنگامی که کاربر ازSleepTrackerFragmentبهSleepQualityFragment,برنامه یکsleepNightKeyبرای شبی که نیاز به به روز رسانی دارد بهSleepQualityFragmentارسال می کند.
مرحله 2: برای ردیابی کیفیت خواب، ناوبری را اضافه کنید
نمودار ناوبری از قبل شامل مسیرهایی از SleepTrackerFragment به SleepQualityFragment و دوباره بازگشت است. با این حال، کنترلکنندههای کلیک که پیمایش از یک قطعه به قطعه دیگر را اجرا میکنند، هنوز کدگذاری نشدهاند. اکنون آن کد را در ViewModel اضافه می کنید.
در کنترل کننده کلیک، LiveData تنظیم می کنید که وقتی می خواهید برنامه به مقصد دیگری حرکت کند تغییر می کند. قطعه این LiveData مشاهده می کند. هنگامی که داده ها تغییر می کنند، قطعه به مقصد حرکت می کند و به مدل view می گوید که کار انجام شده است، که متغیر حالت را بازنشانی می کند.
-
SleepTrackerViewModelباز کنید. باید ناوبری را اضافه کنید تا وقتی کاربر روی دکمه Stop ضربه میزند، برنامه بهSleepQualityFragmentهدایت شود تا رتبهبندی کیفیت را جمعآوری کند. - در
SleepTrackerViewModel، یکLiveDataایجاد کنید که وقتی میخواهید برنامه بهSleepQualityFragmentحرکت کند، تغییر میکند. از کپسوله سازی استفاده کنید تا فقط یک نسخه دریافتی ازLiveDataرا درViewModelنشان دهید.
شما می توانید این کد را در هر نقطه از سطح بالای بدنه کلاس قرار دهید.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()
val navigateToSleepQuality: LiveData<SleepNight>
get() = _navigateToSleepQuality- یک تابع
doneNavigating()اضافه کنید که متغیری را که ناوبری را راهاندازی میکند بازنشانی میکند.
fun doneNavigating() {
_navigateToSleepQuality.value = null
}- در کنترل کننده کلیک برای دکمه Stop ،
onStopTracking()، پیمایش بهSleepQualityFragmentرا فعال کنید. متغیر _navigateToSleepQualityرا در انتهای تابع به عنوان آخرین چیز در بلوکlaunch{}تنظیم کنید. توجه داشته باشید که این متغیر روی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()
}- اپلیکیشن خود را بسازید و اجرا کنید. روی Start ضربه بزنید، سپس روی Stop ضربه بزنید، که شما را به صفحه
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اعلام کنید.doneNavigating()navigateToSleepTrackerو doneNavigating را پیاده سازی کنید.
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()
val navigateToSleepTracker: LiveData<Boolean?>
get() = _navigateToSleepTracker
fun doneNavigating() {
_navigateToSleepTracker.value = null
}- کنترل کننده یک کلیک،
onSetSleepQuality()برای استفاده از تمام تصاویر با کیفیت خواب ایجاد کنید.
از همان الگوی کوروتین مانند در بخش کد قبلی استفاده کنید:
- یک کوروتین را در
uiScopeراهاندازی کنید و به توزیعکننده ورودی/خروجی بروید. -
tonightبا استفاده ازsleepNightKeyدریافت کنید. - کیفیت خواب را تنظیم کنید
- پایگاه داده را به روز کنید.
- راه اندازی ناوبری.
توجه داشته باشید که نمونه کد زیر تمام کارها را در کنترل کننده کلیک انجام می دهد، به جای اینکه عملیات پایگاه داده را در زمینه های مختلف فاکتور بگیرد.
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 اضافه کنید. (اگر خطایی در مورد اتصال مشاهده کردید، فعلاً آن را نادیده بگیرید.)
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)}"- پروژه خود را تمیز و بازسازی کنید. این باید هر گونه خطا را با شی binding حل کند. در غیر این صورت، کش را پاک کنید ( File > Invalidate Caches / Restart ) و برنامه خود را دوباره بسازید.
تبریک می گویم! شما به تازگی یک برنامه کامل پایگاه داده Room را با استفاده از کوروتین ها ساخته اید.
اکنون برنامه شما عالی کار می کند. کاربر می تواند هر چند بار که بخواهد روی Start و Stop ضربه بزند. وقتی کاربر روی Stop ضربه میزند، میتواند کیفیت خواب را وارد کند. وقتی کاربر روی Clear ضربه میزند، تمام دادهها در پسزمینه بیصدا پاک میشوند. با این حال، همه دکمهها همیشه فعال و قابل کلیک هستند، که برنامه را خراب نمیکند، اما به کاربران اجازه میدهد شبهای خواب ناقص ایجاد کنند.
در این آخرین کار، یاد می گیرید که چگونه از نقشه های تبدیل برای مدیریت دید دکمه ها استفاده کنید تا کاربران فقط بتوانند انتخاب درستی داشته باشند. می توانید از روش مشابهی برای نمایش یک پیام دوستانه پس از پاک شدن همه داده ها استفاده کنید.
مرحله 1: وضعیت های دکمه را به روز کنید
ایده این است که وضعیت دکمه را طوری تنظیم کنید که در ابتدا فقط دکمه Start فعال باشد، یعنی قابل کلیک کردن است.
پس از ضربه زدن کاربر به Start ، دکمه Stop فعال می شود و Start فعال نمی شود. دکمه Clear تنها زمانی فعال می شود که داده در پایگاه داده وجود داشته باشد.
- فایل طرح بندی
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است، دکمه شروع باید فعال شود. - دکمه Stop زمانی که
tonightnullنیست باید فعال شود. - دکمه Clear فقط در صورتی باید فعال شود که
nightsو در نتیجه پایگاه داده حاوی شبهای خواب باشد.
val startButtonVisible = Transformations.map(tonight) {
it == null
}
val stopButtonVisible = Transformations.map(tonight) {
it != null
}
val clearButtonVisible = Transformations.map(nights) {
it?.isNotEmpty()
}- برنامه خود را اجرا کنید و با دکمه ها آزمایش کنید.
مرحله 2: از نوار اسنک برای اطلاع دادن به کاربر استفاده کنید
پس از اینکه کاربر پایگاه داده را پاک کرد، با استفاده از ویجت Snackbar تأییدیه ای را به کاربر نشان دهید. یک نوار اسنک بازخورد مختصری در مورد یک عملیات از طریق پیامی در پایین صفحه ارائه می دهد. یک نوار اسنک پس از مهلت زمانی، پس از تعامل کاربر در جای دیگری از صفحه، یا پس از اینکه کاربر نوار اسنک را از روی صفحه نمایش بکشد، ناپدید می شود.
نمایش نوار اسنک یک کار رابط کاربری است و باید در قطعه اتفاق بیفتد. تصمیم گیری برای نمایش نوار اسنک در 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ایجاد کنید و یک منبع داده راه اندازی کنید. - راه اندازی ناوبری. برای جدا کردن نگرانی ها، کنترل کننده کلیک را در مدل view و ناوبری را در قطعه قرار دهید.
- از کپسوله سازی با
LiveDataبرای ردیابی و پاسخ به تغییرات حالت استفاده کنید. - از تبدیل ها با
LiveDataاستفاده کنید. - یک پایگاه داده singleton ایجاد کنید.
- برای عملیات پایگاه داده کوروتین ها را تنظیم کنید.
راه اندازی ناوبری
شما مسیرهای ناوبری ممکن را بین قطعات در یک فایل ناوبری تعریف می کنید. راه های مختلفی برای راه اندازی ناوبری از یک قطعه به قطعه دیگر وجود دارد. این موارد عبارتند از:
- کنترل کننده های
onClickرا برای راه اندازی ناوبری به یک قطعه مقصد تعریف کنید. - از طرف دیگر، برای فعال کردن پیمایش از یک قطعه به قطعه دیگر:
- مقدار
LiveDataرا برای ضبط در صورت ناوبری تعریف کنید. - یک ناظر را به آن مقدار
LiveDataمتصل کنید. - سپس هر زمان که ناوبری باید راه اندازی شود یا کامل شود، کد شما آن مقدار را تغییر می دهد.
تنظیم ویژگی android:enabled
- ویژگی
android:enabledدرTextViewتعریف شده و توسط همه زیر کلاسها از جملهButtonبه ارث میرسد. - مشخصه
android:enabledتعیین می کند کهViewفعال باشد یا خیر. معنای "فعال" بر اساس زیر کلاس متفاوت است. به عنوان مثال، یکEditTextغیرفعال از ویرایش متن موجود توسط کاربر جلوگیری می کند و یکButtonغیرفعال مانع از ضربه زدن کاربر روی دکمه می شود. - مشخصه
enabledبا ویژگیvisibilityیکسان نیست. - می توانید از نقشه های تبدیل برای تنظیم مقدار ویژگی
enabledدکمه ها بر اساس وضعیت یک شی یا متغیر دیگر استفاده کنید.
سایر نکاتی که در این کد لبه پوشش داده شده است:
- برای فعال کردن اعلانها به کاربر، میتوانید از همان تکنیکی که برای راهاندازی ناوبری استفاده میکنید استفاده کنید.
- می توانید از
Snackbarبرای اطلاع دادن به کاربر استفاده کنید.
دوره بی ادبی:
مستندات توسعه دهنده اندروید:
این بخش، تکالیف احتمالی را برای دانشآموزانی که در این آزمایشگاه کد به عنوان بخشی از دورهای که توسط یک مربی هدایت میشود، کار میکنند، فهرست میکند. این وظیفه مربی است که موارد زیر را انجام دهد:
- در صورت نیاز تکالیف را تعیین کنید.
- نحوه ارسال تکالیف را با دانش آموزان در میان بگذارید.
- تکالیف را نمره دهید.
مربیان میتوانند از این پیشنهادات به اندازهای که میخواهند استفاده کنند، و باید با خیال راحت هر تکلیف دیگری را که فکر میکنند مناسب است، محول کنند.
اگر به تنهایی از طریق این کدها کار می کنید، از این تکالیف برای آزمایش دانش خود استفاده کنید.
به این سوالات پاسخ دهید
سوال 1
یکی از راههای فعال کردن برنامهتان برای راهاندازی ناوبری از یک قطعه به قطعه دیگر، استفاده از مقدار LiveData برای نشان دادن اینکه آیا ناوبری را فعال کنید یا نه.
مراحل استفاده از یک مقدار LiveData ، به نام gotoBlueFragment ، برای راه اندازی پیمایش از قطعه قرمز به قطعه آبی چیست؟ همه موارد اعمال شده را انتخاب کنید:
- در
ViewModelمقدارLiveDatagotoBlueFragmentرا تعریف کنید. - در
RedFragment، مقدارgotoBlueFragmentرا مشاهده کنید. کدobserve{}را اجرا کنید تا در صورت لزوم بهBlueFragmentبروید و سپس مقدارgotoBlueFragmentرا برای نشان دادن کامل بودن پیمایش تنظیم مجدد کنید. - مطمئن شوید که کد شما متغیر
gotoBlueFragmentرا روی مقداری تنظیم میکند که هر زمان که برنامه نیاز به رفتن ازRedFragmentبهBlueFragmentداشته باشد، پیمایش را آغاز میکند. - مطمئن شوید که کد شما یک کنترل کننده
onClickرا برایViewتعریف می کند که کاربر برای رفتن بهBlueFragmentروی آن کلیک می کند، جایی که کنترل کنندهonClickمقدارgoToBlueFragmentرا مشاهده می کند.
سوال 2
با استفاده از LiveData میتوانید فعال (قابل کلیک) بودن یک Button را تغییر دهید. چگونه مطمئن می شوید که برنامه شما دکمه UpdateNumber را تغییر می دهد تا:
- اگر مقدار
myNumberبیشتر از 5 باشد، دکمه فعال می شود. - اگر
myNumberبرابر یا کمتر از 5 باشد، دکمه فعال نمی شود.
فرض کنید که چیدمان حاوی دکمه UpdateNumber شامل متغیر <data> برای NumbersViewModel همانطور که در اینجا نشان داده شده است:
<data>
<variable
name="NumbersViewModel"
type="com.example.android.numbersapp.NumbersViewModel" />
</data>فرض کنید شناسه دکمه در فایل layout به صورت زیر باشد:
android:id="@+id/update_number_button"
چه کار دیگری باید انجام دهید؟ همه موارد کاربردی را انتخاب کنید.
- در کلاس
NumbersViewModel، یک متغیرLiveDataبهmyNumberتعریف کنید که نشان دهنده عدد است. همچنین متغیری را تعریف کنید که مقدار آن با فراخوانیTransform.map()روی متغیرmyNumberتنظیم میشود، که یک بولی نشان میدهد که آیا عدد از 5 بزرگتر است یا خیر.
به طور خاص، درViewModel، کد زیر را اضافه کنید:
val myNumber: LiveData<Int>
val enableUpdateNumberButton = Transformations.map(myNumber) {
myNumber > 5
}- در طرح XML، ویژگی
android:enabledupdate_number_button buttonرا رویNumberViewModel.enableUpdateNumbersButtonتنظیم کنید.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"- در
Fragmentکه از کلاسNumbersViewModelاستفاده می کند، یک مشاهده گر به ویژگیenabledدکمه اضافه کنید.
به طور خاص، درFragment، کد زیر را اضافه کنید:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
myNumber > 5
})- در فایل layout، ویژگی
android:enabledupdate_number_button buttonرا روی"Observable"تنظیم کنید.
شروع به درس بعدی:
برای پیوند به سایر کدهای این دوره، به صفحه فرود کد لبههای کد پایه Android Kotlin Fundamentals مراجعه کنید.