Android Kotlin Fundamentals 06.3: استخدام LiveData للتحكّم في حالات الأزرار

يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات Android Kotlin. ستحصل على أقصى قيمة ممكنة من هذه الدورة التدريبية إذا كنت تستخدم الدروس التطبيقية حول الترميز بشكل متسلسل. يتم إدراج جميع الدروس التطبيقية حول ترميز الدورات التدريبية في الصفحة المقصودة لدروس الترميز Android Kotlin Fundamentals.

مقدمة

يلخّص هذا الدرس التطبيقي كيفية استخدام ViewModel والأجزاء معًا لتنفيذ عملية التنقّل. نذكّر بأنّ الهدف هو وضع منطق الوقت المحدّد للانتقال إلى ViewModel، ولكن تحديد المسارات في الأجزاء وملف التنقّل. ولتحقيق هذا الهدف، يمكنك استخدام نماذج العرض والأجزاء وLiveData والمراقبين.

ويلخّص هذا الدرس التطبيقي شرحًا لطريقة ذكية لتتبّع حالات الأزرار باستخدام أقل عدد من الرموز، بحيث يتم تفعيل كل زر والنقر عليه فقط عندما يكون من المنطقي أن ينقر المستخدم على ذلك الزر.

ما يجب معرفته

ويجب أن تكون على دراية بما يلي:

  • إنشاء واجهة مستخدم أساسية باستخدام نشاط وأجزاء وملفات شخصية.
  • الانتقال بين الأجزاء واستخدام safeArgs لتمرير البيانات بين الأجزاء.
  • عرض النماذج وعرض مصانع النماذج والتحوّلات وLiveData ومراصدها.
  • كيفية إنشاء قاعدة بيانات Room وإنشاء كائن الوصول إلى البيانات (DAO) وتحديد الكيانات.
  • كيفية استخدام الكوروتين للتفاعلات في قاعدة البيانات والمهام الأخرى الطويلة الأمد

ما ستتعرَّف عليه

  • طريقة تعديل سجلّ حالي لجودة النوم في قاعدة البيانات
  • كيفية استخدام LiveData في تتبع حالات الأزرار.
  • كيفية عرض شريط للوجبات الخفيفة استجابةً لحدث.

الإجراءات التي ستنفذّها

  • يمكنك توسيع نطاق تطبيق تتبع MySleepquality لجمع تقييم الجودة وإضافة التقييم إلى قاعدة البيانات وعرض النتيجة.
  • استخدِم LiveData لتشغيل عرض شريط الوجبات الخفيفة.
  • يمكنك استخدام LiveData لتفعيل الأزرار وإيقافها.

في هذا الدرس التطبيقي حول الترميز، يمكنك إنشاء تسجيل جودة النوم وواجهة المستخدم النهائية لتطبيقTrackMySleepquality.

يحتوي التطبيق على شاشتين، تمثلهما الأجزاء، كما هو موضّح في الشكل التالي.

تحتوي الشاشة الأولى، الموضحة على اليمين، على أزرار لبدء التتبع وإيقافه. تعرض الشاشة جميع بيانات النوم للمستخدم. يعمل الزر محو على حذف جميع البيانات التي جمعها التطبيق للمستخدم نهائيًا.

الشاشة الثانية، التي تظهر على اليسار، مخصّصة لاختيار تقييم جودة النوم. في التطبيق، يتم تمثيل التقييم رقميًا. لأغراض التطوير، يعرض التطبيق كلاً من رموز الوجه والمعادلات الرقمية لها.

تكون خطوات المستخدم على النحو التالي:

  • يفتح المستخدم التطبيق وتظهر له شاشة تتبُّع النوم.
  • ينقر المستخدم على الزر ابدأ. يسجِّل هذا العمود وقت البدء ويعرضه. يكون زر البدء غير مفعّل، والزر إيقاف مفعّل.
  • ينقر المستخدم على الزر إيقاف. ويتم تسجيل وقت الانتهاء وفتح شاشة جودة النوم.
  • ويختار المستخدم رمز جودة النوم. ويتم إغلاق الشاشة، كما تعرض شاشة التتبُّع وقت انتهاء النوم وجودة النوم. الزر إيقاف غير مفعّل والزر ابدأ مفعّل. التطبيق جاهز لليلة أخرى.
  • يتم تفعيل الزر محو عند توفّر بيانات في قاعدة البيانات. عندما ينقر المستخدم على الزر محو، يتم محو جميع بياناته بدون اللجوء إلى الخطأ - لا تظهر هذه الرسالة&كذلك، هل أنت متأكد؟

يستخدم هذا التطبيق بنية مبسطة، كما هو موضح أدناه في سياق البنية الكاملة. يستخدم التطبيق المكونات التالية فقط:

  • وحدة تحكُّم واجهة المستخدم
  • عرض النموذج وLiveData
  • قاعدة بيانات الغرفة

يفترض هذا الدرس التطبيقي أنك تعرف كيفية تنفيذ عملية التنقّل باستخدام الأجزاء وملف التنقّل. لتوفير عملك، يتم تقديم صفقة جيدة من هذا الرمز.

الخطوة 1: فحص الرمز

  1. للبدء، يُرجى مواصلة استخدام الرمز الخاص بك من نهاية الدرس التطبيقي الأخير أو تنزيل رمز التفعيل.
  2. في رمز إجراء التفعيل، افحص SleepQualityFragment. سيؤدي هذا الصف إلى تضخيم التنسيق والحصول على التطبيق وإرجاع binding.root.
  3. افتح Navigation.xml في محرِّر التصميم. سترى مسارًا للتنقّل من SleepTrackerFragment إلى SleepQualityFragment، والعودة من SleepQualityFragment إلى SleepTrackerFragment.



  4. تحقَّق من رمز ملف Navigation.xml. وعلى وجه الخصوص، ابحث عن <argument> بالاسم sleepNightKey.

    عندما ينتقل المستخدم من SleepTrackerFragment إلى SleepQualityFragment,، سيمرِّر التطبيق sleepNightKey إلى SleepQualityFragment في الليلة التي تحتاج إلى تحديث.

الخطوة 2: إضافة التنقُّل لتتبُّع جودة النوم

يشتمل الرسم البياني للتنقّل على المسارات من SleepTrackerFragment إلى SleepQualityFragment والرجوع مرة أخرى. ومع ذلك، لا يتم ترميز معالجات النقر التي تنفّذ التنقل من جزء إلى آخر حتى الآن. يمكنك إضافة هذا الرمز الآن في ViewModel.

في معالج النقرات، يمكنك ضبط LiveData الذي يتغير عندما تريد أن ينتقل التطبيق إلى وجهة مختلفة. يلاحظ هذا الجزء LiveData. عندما تتغير البيانات، ينتقل الجزء إلى الوجهة ويخبر نموذج الملف الشخصي بأنه قد تم، والذي يعيد تعيين متغير الحالة.

  1. فتح SleepTrackerViewModel عليك إضافة التنقّل لكي ينقر المستخدم على الزر إيقاف عندما ينتقل إلى SleepQualityFragment للحصول على تقييم جودة.
  2. في SleepTrackerViewModel، أنشِئ LiveData عندما تريد أن ينتقل التطبيق إلى SleepQualityFragment. استخدِم المغلّف لعرض نسخة يمكن الوصول إليها من LiveData إلى ViewModel فقط.

    يمكنك وضع هذا الرمز في أي مكان في المستوى العلوي من نص الصف.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()

val navigateToSleepQuality: LiveData<SleepNight>
   get() = _navigateToSleepQuality
  1. أضِف دالة doneNavigating() تعيد ضبط المتغيّر الذي يؤدي إلى تفعيل التنقّل.
fun doneNavigating() {
   _navigateToSleepQuality.value = null
}
  1. في معالج النقر على الزر إيقاف، onStopTracking()، شغِّل التنقّل إلى SleepQualityFragment. اضبط المتغير _navigateToSleepQuality في نهاية الدالة كآخر عنصر داخل المجموعة launch{}. ملاحظة: تم ضبط هذا المتغيّر على 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: إنشاء ViewView وView والمصنع

  1. في حزمة sleepquality، أنشِئ SleepqualityViewmodel.kt أو افتحه.
  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، والتبديل إلى المرسل إلى مؤتمر 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
        }
    }
  1. في الحزمة 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

  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. نظِّم مشروعك وأعِد إنشائه. ويجب أن يؤدي ذلك إلى حل أي أخطاء في العنصر الملزِم. بخلاف ذلك، عليك محو ذاكرة التخزين المؤقت (File > Invalid invalid Cache / Restart (إعادة تخزين ذاكرة التخزين المؤقت / إعادة التشغيل)) ثم إعادة إنشاء تطبيقك.

تهانينا. لقد أنشأت للتو تطبيق قاعدة بيانات Room كاملاً باستخدام الكوروتين.

يعمل تطبيقك الآن بشكل رائع. ويمكن للمستخدم النقر على بدء وإيقاف عدة مرات. عندما ينقر المستخدم على إيقاف، يمكنه إدخال جودة النوم. عندما ينقر المستخدم على محو، يتم محو جميع البيانات تلقائيًا في الخلفية. ومع ذلك، يتم تفعيل جميع الأزرار دائمًا وقابلة للنقر، ما يؤدي إلى إيقاف التطبيق، ولكن يسمح للمستخدمين بإنشاء ليالي نوم غير مكتملة.

في هذه المهمة الأخيرة، ستتعرّف على كيفية استخدام خرائط الإحالات الناجحة لإدارة ظهور الأزرار حتى يتمكّن المستخدمون من اتخاذ القرار المناسب فقط. ويمكنك استخدام طريقة مشابهة لعرض رسالة لطيفة بعد محو جميع البيانات.

الخطوة 1: تعديل حالات الزر

والهدف من ذلك هو ضبط حالة الزر بحيث لا يظهر في البداية سوى زر البدء، ما يعني أنّه يمكن النقر عليه.

بعد أن ينقر المستخدم على بدء، يتم تفعيل زر إيقاف ولا يتم تفعيل بدء. لا يتم تفعيل زرّ محو إلا عندما تتوفّر بيانات في قاعدة البيانات.

  1. افتح ملف التنسيق fragment_sleep_tracker.xml.
  2. أضِف السمة android:enabled إلى كل زر. السمة android:enabled هي قيمة منطقية تشير إلى ما إذا كان الزر مفعَّلاً أم لا. (يمكن النقر على زر مفعّل، ولا يمكن استخدام زر غير مفعّل't). امنح الخاصية قيمة متغير الحالة الذي ستحدده خلال لحظات.

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. يقدّم شريط للوجبات الخفيفة ملاحظات موجزة عن إحدى العمليات من خلال رسالة في أسفل الشاشة. يختفي شريط الوجبات الخفيفة بعد المهلة، أو بعد تفاعل المستخدم في مكان آخر على الشاشة، أو بعد أن يُمرِّر المستخدم شريط الوجبات الخفيفة خارج الشاشة.

عرض شريط الوجبات الخفيفة مهمة في واجهة المستخدم، ويجب أن يحدث ذلك في الجزء. اتخاذ قرار عرض شريط الوجبات الخفيفة يحدث في 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(). ولإجراء ذلك، اضبط قيمة الحدث على true في المجموعة launch:
_showSnackbarEvent.value = true
  1. إنشاء التطبيق وتشغيله

مشروع "استوديو 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".

الانتقال إلى الدرس التالي: 7.1 أساسيات إعادة تدوير العرض

وللحصول على روابط إلى دروس تطبيقية أخرى حول الترميز في هذه الدورة التدريبية، يُرجى الاطّلاع على الصفحة المقصودة لتطبيق الدروس التطبيقية حول الترميز Kotlin Fundamentals.