يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات Android Kotlin. ستحصل على أقصى قيمة ممكنة من هذه الدورة التدريبية إذا كنت تستخدم الدروس التطبيقية حول الترميز بشكل متسلسل. يتم إدراج جميع الدروس التطبيقية حول ترميز الدورات التدريبية في الصفحة المقصودة لدروس الترميز Android Kotlin Fundamentals.
مقدمة
يلخّص هذا الدرس التطبيقي كيفية استخدام ViewModel
والأجزاء معًا لتنفيذ عملية التنقّل. نذكّر بأنّ الهدف هو وضع منطق الوقت المحدّد للانتقال إلى ViewModel
، ولكن تحديد المسارات في الأجزاء وملف التنقّل. ولتحقيق هذا الهدف، يمكنك استخدام نماذج العرض والأجزاء وLiveData
والمراقبين.
ويلخّص هذا الدرس التطبيقي شرحًا لطريقة ذكية لتتبّع حالات الأزرار باستخدام أقل عدد من الرموز، بحيث يتم تفعيل كل زر والنقر عليه فقط عندما يكون من المنطقي أن ينقر المستخدم على ذلك الزر.
ما يجب معرفته
ويجب أن تكون على دراية بما يلي:
- إنشاء واجهة مستخدم أساسية باستخدام نشاط وأجزاء وملفات شخصية.
- الانتقال بين الأجزاء واستخدام
safeArgs
لتمرير البيانات بين الأجزاء. - عرض النماذج وعرض مصانع النماذج والتحوّلات و
LiveData
ومراصدها. - كيفية إنشاء قاعدة بيانات
Room
وإنشاء كائن الوصول إلى البيانات (DAO) وتحديد الكيانات. - كيفية استخدام الكوروتين للتفاعلات في قاعدة البيانات والمهام الأخرى الطويلة الأمد
ما ستتعرَّف عليه
- طريقة تعديل سجلّ حالي لجودة النوم في قاعدة البيانات
- كيفية استخدام
LiveData
في تتبع حالات الأزرار. - كيفية عرض شريط للوجبات الخفيفة استجابةً لحدث.
الإجراءات التي ستنفذّها
- يمكنك توسيع نطاق تطبيق تتبع MySleepquality لجمع تقييم الجودة وإضافة التقييم إلى قاعدة البيانات وعرض النتيجة.
- استخدِم
LiveData
لتشغيل عرض شريط الوجبات الخفيفة. - يمكنك استخدام
LiveData
لتفعيل الأزرار وإيقافها.
في هذا الدرس التطبيقي حول الترميز، يمكنك إنشاء تسجيل جودة النوم وواجهة المستخدم النهائية لتطبيقTrackMySleepquality.
يحتوي التطبيق على شاشتين، تمثلهما الأجزاء، كما هو موضّح في الشكل التالي.
تحتوي الشاشة الأولى، الموضحة على اليمين، على أزرار لبدء التتبع وإيقافه. تعرض الشاشة جميع بيانات النوم للمستخدم. يعمل الزر محو على حذف جميع البيانات التي جمعها التطبيق للمستخدم نهائيًا.
الشاشة الثانية، التي تظهر على اليسار، مخصّصة لاختيار تقييم جودة النوم. في التطبيق، يتم تمثيل التقييم رقميًا. لأغراض التطوير، يعرض التطبيق كلاً من رموز الوجه والمعادلات الرقمية لها.
تكون خطوات المستخدم على النحو التالي:
- يفتح المستخدم التطبيق وتظهر له شاشة تتبُّع النوم.
- ينقر المستخدم على الزر ابدأ. يسجِّل هذا العمود وقت البدء ويعرضه. يكون زر البدء غير مفعّل، والزر إيقاف مفعّل.
- ينقر المستخدم على الزر إيقاف. ويتم تسجيل وقت الانتهاء وفتح شاشة جودة النوم.
- ويختار المستخدم رمز جودة النوم. ويتم إغلاق الشاشة، كما تعرض شاشة التتبُّع وقت انتهاء النوم وجودة النوم. الزر إيقاف غير مفعّل والزر ابدأ مفعّل. التطبيق جاهز لليلة أخرى.
- يتم تفعيل الزر محو عند توفّر بيانات في قاعدة البيانات. عندما ينقر المستخدم على الزر محو، يتم محو جميع بياناته بدون اللجوء إلى الخطأ - لا تظهر هذه الرسالة&كذلك، هل أنت متأكد؟
يستخدم هذا التطبيق بنية مبسطة، كما هو موضح أدناه في سياق البنية الكاملة. يستخدم التطبيق المكونات التالية فقط:
- وحدة تحكُّم واجهة المستخدم
- عرض النموذج و
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
. عندما تتغير البيانات، ينتقل الجزء إلى الوجهة ويخبر نموذج الملف الشخصي بأنه قد تم، والذي يعيد تعيين متغير الحالة.
- فتح
SleepTrackerViewModel
عليك إضافة التنقّل لكي ينقر المستخدم على الزر إيقاف عندما ينتقل إلىSleepQualityFragment
للحصول على تقييم جودة. - في
SleepTrackerViewModel
، أنشِئLiveData
عندما تريد أن ينتقل التطبيق إلىSleepQualityFragment
. استخدِم المغلّف لعرض نسخة يمكن الوصول إليها منLiveData
إلىViewModel
فقط.
يمكنك وضع هذا الرمز في أي مكان في المستوى العلوي من نص الصف.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()
val navigateToSleepQuality: LiveData<SleepNight>
get() = _navigateToSleepQuality
- أضِف دالة
doneNavigating()
تعيد ضبط المتغيّر الذي يؤدي إلى تفعيل التنقّل.
fun doneNavigating() {
_navigateToSleepQuality.value = null
}
- في معالج النقر على الزر إيقاف،
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()
}
- أنشئ تطبيقك وشغِّله. انقر على بدء، ثم انقر على إيقاف، وسيتم نقلك إلى شاشة
SleepQualityFragment
. للرجوع، استخدم زر الرجوع في النظام.
في هذه المهمة، يمكنك تسجيل جودة النوم والانتقال إلى جزء تتبُّع النوم. يجب أن يتم تعديل الشاشة تلقائيًا لعرض القيمة المعدَّلة للمستخدم. عليك إنشاء ViewModel
وViewModelFactory
، وعليك تعديل SleepQualityFragment
.
الخطوة 1: إنشاء ViewView وView والمصنع
- في حزمة
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
، والتبديل إلى المرسل إلى مؤتمر I/O. - يمكنك الحصول على
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.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)}"
- نظِّم مشروعك وأعِد إنشائه. ويجب أن يؤدي ذلك إلى حل أي أخطاء في العنصر الملزِم. بخلاف ذلك، عليك محو ذاكرة التخزين المؤقت (File > Invalid invalid Cache / Restart (إعادة تخزين ذاكرة التخزين المؤقت / إعادة التشغيل)) ثم إعادة إنشاء تطبيقك.
تهانينا. لقد أنشأت للتو تطبيق قاعدة بيانات Room
كاملاً باستخدام الكوروتين.
يعمل تطبيقك الآن بشكل رائع. ويمكن للمستخدم النقر على بدء وإيقاف عدة مرات. عندما ينقر المستخدم على إيقاف، يمكنه إدخال جودة النوم. عندما ينقر المستخدم على محو، يتم محو جميع البيانات تلقائيًا في الخلفية. ومع ذلك، يتم تفعيل جميع الأزرار دائمًا وقابلة للنقر، ما يؤدي إلى إيقاف التطبيق، ولكن يسمح للمستخدمين بإنشاء ليالي نوم غير مكتملة.
في هذه المهمة الأخيرة، ستتعرّف على كيفية استخدام خرائط الإحالات الناجحة لإدارة ظهور الأزرار حتى يتمكّن المستخدمون من اتخاذ القرار المناسب فقط. ويمكنك استخدام طريقة مشابهة لعرض رسالة لطيفة بعد محو جميع البيانات.
الخطوة 1: تعديل حالات الزر
والهدف من ذلك هو ضبط حالة الزر بحيث لا يظهر في البداية سوى زر البدء، ما يعني أنّه يمكن النقر عليه.
بعد أن ينقر المستخدم على بدء، يتم تفعيل زر إيقاف ولا يتم تفعيل بدء. لا يتم تفعيل زرّ محو إلا عندما تتوفّر بيانات في قاعدة البيانات.
- افتح ملف التنسيق
fragment_sleep_tracker.xml
. - أضِف السمة
android:enabled
إلى كل زر. السمةandroid:enabled
هي قيمة منطقية تشير إلى ما إذا كان الزر مفعَّلاً أم لا. (يمكن النقر على زر مفعّل، ولا يمكن استخدام زر غير مفعّل't). امنح الخاصية قيمة متغير الحالة الذي ستحدده خلال لحظات.
start_button
:
android:enabled="@{sleepTrackerViewModel.startButtonVisible}"
stop_button
:
android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"
clear_button
:
android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"
- افتح
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()
}
- شغِّل تطبيقك، وجرِّب استخدام الأزرار.
الخطوة 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()
. ولإجراء ذلك، اضبط قيمة الحدث علىtrue
في المجموعةlaunch
:
_showSnackbarEvent.value = true
- إنشاء التطبيق وتشغيله
مشروع "استوديو Android": TrackMySleepالجودة النهائية
يشبه تنفيذ تتبّع جودة النوم في هذا التطبيق تشغيل نوتة مألوفة في مفتاح جديد. أثناء تغيير التفاصيل، يظل النمط الأساسي لما فعلته في الدروس التطبيقية السابقة للترميز في هذا الدرس كما هو. تؤدي معرفة هذه الأنماط إلى تسريع عملية الترميز، لأنه يمكنك إعادة استخدام الرمز من التطبيقات الحالية. في ما يلي بعض الأنماط المستخدمة في هذه الدورة التدريبية حتى الآن:
- إنشاء
ViewModel
وViewModelFactory
وإعداد مصدر بيانات. - تشغيل الملاحة. لفصل المخاوف، ضَع معالج النقرات في نموذج الملف الشخصي وفي شريط التنقّل في الجزء.
- استخدِم الغلاف مع
LiveData
لتتبّع تغييرات الحالة والاستجابة لها. - يمكنك استخدام التحويل مع
LiveData
. - إنشاء قاعدة بيانات مفردة.
- إعداد الكوروتينات لعمليات قاعدة البيانات.
تشغيل التنقّل
يمكنك تحديد مسارات التنقل المحتملة بين الأجزاء في ملف التنقل. تتوفّر بعض الطرق المختلفة لتشغيل التنقّل من جزء إلى آخر. وتشمل هذه الروابط ما يلي:
- تحديد معالجات
onClick
لتشغيل التنقل إلى جزء وجهة. - بدلاً من ذلك، لتفعيل التنقل من جزء إلى آخر:
- اختَر قيمة
LiveData
للتسجيل في حال حدوث تنقّل. - أرفِق أداة مراقبة إلى قيمة
LiveData
هذه. - وسيغيّر الرمز بعد ذلك هذه القيمة عندما يتطلب الأمر التنقّل أو تكتمل.
إعداد السمة android:enabled
- يتم تحديد السمة
android:enabled
فيTextView
وتكتسبها جميع الفئات الفرعية، بما في ذلكButton
. - تحدّد السمة
android:enabled
ما إذا تم تفعيل السمةView
أو لا. يختلف معنى &"enabled" حسب الفئة الفرعية. على سبيل المثال، يؤدي تفعيلEditText
غير المفعّلة إلى منع المستخدم من تعديل النص المضمّن، والطريقةButton
التي لم يتم تفعيلها تمنع المستخدم من النقر على الزر. - تختلف السمة
enabled
عن السمةvisibility
. - يمكنك استخدام خرائط التحويل لضبط قيمة السمة
enabled
للأزرار بناءً على حالة كائن أو متغير آخر.
النقاط الأخرى التي يتناولها هذا الدرس التطبيقي حول الترميز:
- لتشغيل الإشعارات للمستخدم، يمكنك استخدام نفس الأسلوب الذي تستخدمه لتشغيل التنقل.
- ويمكنك استخدام
Snackbar
لإعلام المستخدم.
دورة Udacity:
مستندات مطوّر برامج Android:
يسرد هذا القسم المهام الدراسية المحتملة للطلاب الذين يعملون من خلال هذا الدرس التطبيقي حول الترميز في إطار دورة تدريبية يُديرها معلِّم. يجب أن ينفِّذ المعلّم ما يلي:
- يمكنك تخصيص واجب منزلي إذا لزم الأمر.
- التواصل مع الطلاب بشأن كيفية إرسال الواجبات المنزلية
- وضع درجات للواجبات المنزلية.
ويمكن للمعلّمين استخدام هذه الاقتراحات بقدر ما يريدون أو بقدر ما يريدون، ويجب عدم التردد في تخصيص أي واجبات منزلية أخرى مناسبة.
إذا كنت تستخدم هذا الدرس التطبيقي بنفسك، يمكنك استخدام هذه الواجبات المنزلية لاختبار معلوماتك.
الإجابة عن هذه الأسئلة
السؤال 1
وتتمثل إحدى طرق تفعيل تطبيقك للتنقّل من جزء إلى آخر في استخدام قيمة LiveData
للإشارة إلى ما إذا كان سيتم تشغيل التنقّل أم لا.
ما هي خطوات استخدام قيمة LiveData
، التي تُسمى gotoBlueFragment
، لتشغيل الانتقال من الجزء الأحمر إلى الجزء الأزرق؟ اختر كلّ الإجابات المنطبقة.
- في
ViewModel
، حدِّد القيمةLiveData
gotoBlueFragment
. - في
RedFragment
، راقِب القيمةgotoBlueFragment
. استخدِم الرمزobserve{}
للانتقال إلىBlueFragment
عند اللزوم، ثم أعِد ضبطgotoBlueFragment
للإشارة إلى اكتمال عملية التنقّل. - تأكّد من أنّ الرمز يعمل على ضبط المتغير
gotoBlueFragment
على القيمة التي تؤدي إلى تفعيل التنقّل عندما يحتاج التطبيق إلى الانتقال منRedFragment
إلىBlueFragment
. - تأكّد من أنّ الرمز يحدّد معالج
onClick
للسمةView
التي ينقر المستخدم للانتقال إليها عنBlueFragment
، حيث يلاحظ المعالجonClick
القيمةgoToBlueFragment
.
السؤال 2
يمكنك تغيير ما إذا كان سيتم تفعيل Button
(قابل للنقر) أم لا باستخدام LiveData
. وكيف يمكنك ضمان أنّ تطبيقك يغيّر زر UpdateNumber
بحيث:
- يتم تفعيل الزر إذا كانت قيمة
myNumber
أكبر من 5. - لا يتم تفعيل الزرّ إذا كان
myNumber
يساوي 5 أو أقل من ذلك.
افترض أن التنسيق الذي يحتوي على الزر UpdateNumber
يتضمن المتغير <data>
لـ NumbersViewModel
كما هو موضح هنا:
<data> <variable name="NumbersViewModel" type="com.example.android.numbersapp.NumbersViewModel" /> </data>
لنفترض أن رقم تعريف الزر في ملف التنسيق هو ما يلي:
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:enabled
لـupdate_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
})
- في ملف التنسيق، اضبط السمة
android:enabled
لـupdate_number_button button
على"Observable"
.
الانتقال إلى الدرس التالي:
وللحصول على روابط إلى دروس تطبيقية أخرى حول الترميز في هذه الدورة التدريبية، يُرجى الاطّلاع على الصفحة المقصودة لتطبيق الدروس التطبيقية حول الترميز Kotlin Fundamentals.