‫Android Kotlin Fundamentals 05.3: ربط البيانات باستخدام ViewModel وLiveData

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

مقدمة

في الدروس البرمجية السابقة في هذا الدرس، حسّنت رمز تطبيق GuessTheWord. يستخدم التطبيق الآن عناصر ViewModel، لذا تظل بيانات التطبيق محفوظة عند إجراء تغييرات في إعدادات الجهاز، مثل تدوير الشاشة وتغيير حالة توفّر لوحة المفاتيح. أضفت أيضًا LiveData قابلاً للملاحظة، لذا يتم إعلام طرق العرض تلقائيًا عند تغيُّر البيانات التي تتم ملاحظتها.

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

يمكنك أيضًا تغيير تطبيق GuessTheWord لاستخدام LiveData كمصدر ربط البيانات لإعلام واجهة المستخدم بالتغييرات في البيانات، بدون استخدام طرق مراقبة LiveData.

ما يجب معرفته

  • كيفية إنشاء تطبيقات Android أساسية في Kotlin
  • طريقة عمل دورات حياة الأنشطة والتقسيمات
  • كيفية استخدام عناصر ViewModel في تطبيقك
  • كيفية تخزين البيانات باستخدام LiveData في ViewModel
  • كيفية إضافة طرق مراقبة لتتبُّع التغييرات في بيانات LiveData

أهداف الدورة التعليمية

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

  • تتواصل طرق العرض في تخطيطات GuessTheWord بشكل غير مباشر مع عناصر ViewModel، وذلك باستخدام أدوات التحكّم في واجهة المستخدم (اللقطات) لنقل المعلومات. في هذا الدرس العملي، ستربط طرق عرض التطبيق بكائنات ViewModel لكي تتواصل طرق العرض مباشرةً مع كائنات ViewModel.
  • تغيير التطبيق لاستخدام LiveData كمصدر لربط البيانات بعد هذا التغيير، تُعلِم عناصر LiveData واجهة المستخدم بالتغييرات في البيانات، ولن تعود هناك حاجة إلى طرق مراقبة LiveData.

في دروس الترميز التطبيقية في الدرس 5، ستطوّر تطبيق GuessTheWord، بدءًا من الرموز البرمجية للمبتدئين. ‫GuessTheWord هي لعبة تمثيل لشخصيات من لاعبَين، حيث يتعاون اللاعبان لتحقيق أعلى نتيجة ممكنة.

ينظر اللاعب الأول إلى الكلمات في التطبيق ويمثّل كل كلمة بالتناوب، مع الحرص على عدم إظهار الكلمة للاعب الثاني. يحاول اللاعب الثاني تخمين الكلمة.

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

يؤدي اللاعب الأول الكلمة، مع الحرص على عدم قول الكلمة نفسها.

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

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

شاشة العنوان

شاشة اللعبة

شاشة النتيجة

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

  1. (اختياري) إذا كنت لا تستخدم الرمز من الدرس التطبيقي السابق حول الترميز، يمكنك تنزيل رمز البداية لهذا الدرس التطبيقي حول الترميز. فك ضغط الرمز البرمجي، وافتح المشروع في "استوديو Android".
  2. شغِّل التطبيق واللعبة.
  3. يُرجى العِلم أنّ الزر حسنًا يعرض الكلمة التالية ويزيد النتيجة بمقدار واحد، بينما يعرض الزر تخطّي الكلمة التالية ويقلّل النتيجة بمقدار واحد. يؤدي النقر على الزر إنهاء اللعبة إلى إنهاء اللعبة.
  4. تنقَّل بين جميع الكلمات، ولاحظ أنّ التطبيق ينتقل تلقائيًا إلى شاشة النتائج.

في تجربة عملية سابقة، استخدمت ربط البيانات كطريقة آمنة للوصول إلى طرق العرض في تطبيق GuessTheWord، ولكن تكمن القوة الحقيقية لربط البيانات في تنفيذ ما يشير إليه الاسم: ربط البيانات مباشرةً بعناصر عرض البيانات في تطبيقك.

بنية التطبيق الحالية

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

على سبيل المثال:

  • يتم تعريف الزر حسنًا على أنّه Button في ملف التنسيق game_fragment.xml.
  • عندما ينقر المستخدم على الزر حسنًا، يستدعي معالج النقرات في الجزء GameFragment معالج النقرات المقابل في GameViewModel.
  • يتم تعديل النتيجة في GameViewModel.

لا يتواصل العرض Button مع GameViewModel مباشرةً، بل يحتاج إلى أداة معالجة النقرات المتوفّرة في GameFragment.

تمرير ViewModel إلى ربط البيانات

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

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

في هذه المهمة، ستربط الصفين GameViewModel وScoreViewModel بتنسيقات XML المقابلة لهما. يمكنك أيضًا إعداد عمليات ربط أدوات معالجة الأحداث للتعامل مع أحداث النقر.

الخطوة 1: إضافة ربط البيانات إلى GameViewModel

في هذه الخطوة، عليك ربط GameViewModel بملف التصميم المقابل game_fragment.xml.

  1. في الملف game_fragment.xml، أضِف متغيّر ربط بيانات من النوع GameViewModel. إذا ظهرت لك أخطاء في "استوديو Android"، عليك تنظيف المشروع وإعادة إنشائه.
<layout ...>

   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  
   <androidx.constraintlayout...
  1. في الملف GameFragment، مرِّر GameViewModel إلى ربط البيانات.

    لإجراء ذلك، عليك تعيين viewModel إلى المتغيّر binding.gameViewModel الذي سبق أن عرّفته في الخطوة السابقة. ضَع هذا الرمز داخل onCreateView()، بعد تهيئة viewModel. إذا ظهرت لك أخطاء في "استوديو Android"، عليك تنظيف المشروع وإعادة إنشائه.
// Set the viewmodel for databinding - this allows the bound layout access 
// to all the data in the ViewModel
binding.gameViewModel = viewModel

الخطوة 2: استخدام عمليات ربط المستمعين للتعامل مع الأحداث

عمليات ربط أدوات المعالجة هي عبارة عن تعبيرات ربط يتم تنفيذها عند تشغيل أحداث مثل onClick() أو onZoomIn() أو onZoomOut(). تتم كتابة عمليات ربط معالِج الأحداث كتعبيرات lambda.

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

في هذه الخطوة، يمكنك استبدال أدوات معالجة النقرات في GameFragment بربط أدوات المعالجة في الملف game_fragment.xml.

  1. في game_fragment.xml، أضِف السمة onClick إلى skip_button. حدِّد تعبير ربط واستدعِ طريقة onSkip() في GameViewModel. يُطلق على تعبير الربط هذا اسم ربط المستمع.
<Button
   android:id="@+id/skip_button"
   ...
   android:onClick="@{() -> gameViewModel.onSkip()}"
   ... />
  1. وبالمثل، اربط حدث النقر على correct_button بالطريقة onCorrect() في GameViewModel.
<Button
   android:id="@+id/correct_button"
   ...
   android:onClick="@{() -> gameViewModel.onCorrect()}"
   ... />
  1. اربط حدث النقر على end_game_button بالطريقة onGameFinish() في GameViewModel.
<Button
   android:id="@+id/end_game_button"
   ...
   android:onClick="@{() -> gameViewModel.onGameFinish()}"
   ... />
  1. في GameFragment، أزِل العبارات التي تضبط أدوات معالجة النقرات، وأزِل الدوال التي تستدعيها أدوات معالجة النقرات. لم تعُد بحاجة إليها.

الرمز المطلوب إزالته:

binding.correctButton.setOnClickListener { onCorrect() }
binding.skipButton.setOnClickListener { onSkip() }
binding.endGameButton.setOnClickListener { onEndGame() }

/** Methods for buttons presses **/
private fun onSkip() {
   viewModel.onSkip()
}
private fun onCorrect() {
   viewModel.onCorrect()
}
private fun onEndGame() {
   gameFinished()
}

الخطوة 3: إضافة ربط البيانات إلى ScoreViewModel

في هذه الخطوة، عليك ربط ScoreViewModel بملف التصميم المقابل score_fragment.xml.

  1. في الملف score_fragment.xml، أضِف متغيّر ربط من النوع ScoreViewModel. تشبه هذه الخطوة ما فعلته مع GameViewModel أعلاه.
<layout ...>
   <data>
       <variable
           name="scoreViewModel"
           type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
   </data>
   <androidx.constraintlayout.widget.ConstraintLayout
  1. في score_fragment.xml، أضِف السمة onClick إلى play_again_button. حدِّد ربط معالج الأحداث واستدعِ طريقة onPlayAgain() في ScoreViewModel.
<Button
   android:id="@+id/play_again_button"
   ...
   android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
   ... />
  1. في ScoreFragment، داخل onCreateView()، ابدأ viewModel. بعد ذلك، عليك تهيئة متغير الربط binding.scoreViewModel.
viewModel = ...
binding.scoreViewModel = viewModel
  1. في ScoreFragment، أزِل الرمز الذي يضبط أداة معالجة النقرات لعنصر playAgainButton. إذا عرض "استوديو Android" خطأً، نظِّف المشروع وأعِد إنشاءه.

الرمز المطلوب إزالته:

binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. شغِّل تطبيقك. من المفترض أن يعمل التطبيق كما كان من قبل، ولكن الآن تتواصل طرق عرض الأزرار مباشرةً مع عناصر ViewModel. لم تعُد طرق العرض تتواصل من خلال معالجات النقر على الأزرار في ScoreFragment.

تحديد المشاكل في رسائل الخطأ المتعلقة بربط البيانات وحلّها

عندما يستخدم تطبيق ربط البيانات، تنشئ عملية التجميع فئات وسيطة تُستخدَم لربط البيانات. يمكن أن يتضمّن التطبيق أخطاء لا يرصدها Android Studio إلى أن تحاول تجميع التطبيق، لذا لا تظهر لك تحذيرات أو رمز أحمر أثناء كتابة الرمز. ولكن عند وقت التجميع، ستتلقّى أخطاء غامضة مصدرها الفئات الوسيطة التي تم إنشاؤها.

إذا ظهرت لك رسالة خطأ غير واضحة، اتّبِع الخطوات التالية:

  1. انظر بعناية إلى الرسالة في لوحة الإنشاء في "استوديو Android". إذا رأيت موقعًا جغرافيًا ينتهي بـ databinding، يعني ذلك حدوث خطأ في ربط البيانات.
  2. في ملف XML الخاص بالتصميم، ابحث عن أخطاء في سمات onClick التي تستخدم ربط البيانات. ابحث عن الدالة التي يستدعيها تعبير lambda وتأكَّد من أنّها متوفّرة.
  3. في القسم <data> من ملف XML، تحقَّق من التدقيق الإملائي لمتغيّر ربط البيانات.

على سبيل المثال، لاحظ الخطأ الإملائي في اسم الدالة onCorrect() في قيمة السمة التالية:

android:onClick="@{() -> gameViewModel.onCorrectx()}"

يُرجى أيضًا ملاحظة الخطأ الإملائي في gameViewModel في القسم <data> من ملف XML:

<data>
   <variable
       name="gameViewModelx"
       type="com.example.android.guesstheword.screens.game.GameViewModel" />
</data>

لا يرصد Android Studio أخطاءً مثل هذه إلا بعد تجميع التطبيق، ثم يعرض المجمّع رسالة خطأ مثل ما يلي:

error: cannot find symbol
import com.example.android.guesstheword.databinding.GameFragmentBindingImpl"

symbol:   class GameFragmentBindingImpl
location: package com.example.android.guesstheword.databinding

تعمل ميزة ربط البيانات بشكل جيد مع LiveData المستخدَمة مع عناصر ViewModel. بعد إضافة ربط البيانات إلى عناصر ViewModel، يمكنك الآن دمج LiveData.

في هذه المهمة، ستغيّر تطبيق GuessTheWord لاستخدام LiveData كمصدر ربط البيانات لإعلام واجهة المستخدم بالتغييرات في البيانات، بدون استخدام طرق المراقبة LiveData.

الخطوة 1: إضافة كلمة LiveData إلى ملف game_fragment.xml

في هذه الخطوة، يمكنك ربط عرض نص الكلمة الحالية مباشرةً بالعنصر LiveData في ViewModel.

  1. في game_fragment.xml، أضِف السمة android:text إلى طريقة عرض النص word_text.

اضبطها على العنصر LiveData، word من GameViewModel، باستخدام متغير الربط gameViewModel.

<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{gameViewModel.word}"
   ... />

يُرجى العِلم أنّه ليس عليك استخدام word.value. يمكنك بدلاً من ذلك استخدام عنصر LiveData الفعلي. يعرض الكائن LiveData القيمة الحالية لـ word. إذا كانت قيمة word فارغة، يعرض العنصر LiveData سلسلة فارغة.

  1. في GameFragment، في onCreateView()، بعد تهيئة gameViewModel، اضبط النشاط الحالي كمالك دورة حياة المتغيّر binding. يحدّد ذلك نطاق العنصر LiveData أعلاه، ما يسمح للعنصر بتعديل طرق العرض في التصميم تلقائيًا، game_fragment.xml.
binding.gameViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. في GameFragment، أزِل المراقب من LiveData word.

الرمز المطلوب إزالته:

/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})
  1. شغِّل تطبيقك والعب اللعبة. يتم الآن تعديل الكلمة الحالية بدون طريقة مراقبة في وحدة التحكّم في واجهة المستخدم.

الخطوة 2: إضافة LiveData الخاصة بالنتيجة إلى ملف score_fragment.xml

في هذه الخطوة، عليك ربط LiveData score بعرض نص النتيجة في جزء النتيجة.

  1. في score_fragment.xml، أضِف السمة android:text إلى طريقة عرض نص النتيجة. عيِّن scoreViewModel.score للسمة text. بما أنّ score هو عدد صحيح، عليك تحويله إلى سلسلة باستخدام String.valueOf().
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{String.valueOf(scoreViewModel.score)}"
   ... />
  1. في ScoreFragment، بعد تهيئة scoreViewModel، اضبط النشاط الحالي كمالك دورة حياة المتغيّر binding.
binding.scoreViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. في ScoreFragment، أزِل أداة المراقبة للعنصر score.

الرمز المطلوب إزالته:

// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. شغِّل تطبيقك والعب اللعبة. لاحظ أنّ النتيجة في جزء النتيجة يتم عرضها بشكل صحيح، بدون مراقب في جزء النتيجة.

الخطوة 3: إضافة تنسيق السلسلة باستخدام ربط البيانات

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

  1. في string.xml، أضِف السلاسل التالية التي ستستخدمها لتنسيق طرق عرض النص word وscore. %s و%d هما العنصران النائبان للكلمة الحالية والنتيجة الحالية.
<string name="quote_format">\"%s\"</string>
<string name="score_format">Current Score: %d</string>
  1. في game_fragment.xml، عدِّل السمة text لعرض النص word_text لاستخدام مورد السلسلة quote_format. النجاح في gameViewModel.word يؤدي ذلك إلى تمرير الكلمة الحالية كوسيطة إلى سلسلة التنسيق.
<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{@string/quote_format(gameViewModel.word)}"
   ... />
  1. نسِّق طريقة عرض النص score بشكل مشابه لـ word_text. في game_fragment.xml، أضِف السمة text إلى عرض النص score_text. استخدِم مورد السلسلة score_format الذي يقبل وسيطة رقمية واحدة ممثّلة بالعنصر النائب %d. مرِّر الكائن LiveData، score، كوسيطة إلى سلسلة التنسيق هذه.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{@string/score_format(gameViewModel.score)}"
   ... />
  1. في الفئة GameFragment، داخل طريقة onCreateView()، أزِل رمز المراقب score.

الرمز المطلوب إزالته:

viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. نظِّف تطبيقك وأعِد إنشائه وشغِّله، ثم العب اللعبة. لاحظ أنّه يتم تنسيق الكلمة الحالية والنتيجة في شاشة اللعبة.

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

مشروع "استوديو Android": GuessTheWord

  • تعمل "مكتبة ربط البيانات" بسلاسة مع "مكوّنات بنية Android"، مثل ViewModel وLiveData.
  • يمكن ربط التصاميم في تطبيقك بالبيانات في "مكوّنات البنية" التي تساعدك حاليًا في إدارة مراحل نشاط وحدة التحكّم في واجهة المستخدم وإرسال إشعارات بشأن التغييرات في البيانات.

ربط البيانات في ViewModel

  • يمكنك ربط ViewModel بتصميم باستخدام ربط البيانات.
  • تحتوي عناصر ViewModel على بيانات واجهة المستخدم. من خلال تمرير عناصر ViewModel إلى ربط البيانات، يمكنك أتمتة بعض عمليات التواصل بين طرق العرض وعناصر ViewModel.

كيفية ربط ViewModel بتصميم:

  • في ملف التصميم، أضِف متغيّر ربط بيانات من النوع ViewModel.
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • في الملف GameFragment، مرِّر GameViewModel إلى ربط البيانات.
binding.gameViewModel = viewModel

عمليات ربط معالِج الأحداث

  • عمليات ربط معالِج الأحداث هي عبارة عن تعبيرات ربط في التصميم يتم تنفيذها عند تشغيل أحداث النقر، مثل onClick().
  • تتم كتابة عمليات ربط معالِج الأحداث كتعبيرات lambda.
  • باستخدام عمليات ربط معالجات الأحداث، يمكنك استبدال معالجات الأحداث في عناصر التحكّم في واجهة المستخدم بعمليات ربط معالجات الأحداث في ملف التنسيق.
  • تنشئ ميزة ربط البيانات أداة معالجة أحداث وتضبطها على طريقة العرض.
 android:onClick="@{() -> gameViewModel.onSkip()}"

إضافة LiveData إلى ربط البيانات

  • يمكن استخدام عناصر LiveData كمصدر لربط البيانات من أجل إبلاغ واجهة المستخدم تلقائيًا بالتغييرات في البيانات.
  • يمكنك ربط طريقة العرض مباشرةً بالكائن LiveData في ViewModel. عندما يتغيّر LiveData في ViewModel، يمكن تعديل طرق العرض في التصميم تلقائيًا، بدون طرق المراقبة في وحدات التحكّم في واجهة المستخدم.
android:text="@{gameViewModel.word}"
  • لإتاحة عمل ربط البيانات LiveData، اضبط النشاط الحالي (عنصر التحكّم في واجهة المستخدم) كمالك دورة حياة المتغيّر binding في عنصر التحكّم في واجهة المستخدم.
binding.lifecycleOwner = this

تنسيق السلاسل باستخدام ربط البيانات

  • باستخدام ربط البيانات، يمكنك تنسيق مورد سلسلة باستخدام عناصر نائبة مثل %s للسلاسل و%d للأعداد الصحيحة.
  • لتعديل السمة text الخاصة بالعرض، مرِّر الكائن LiveData كوسيطة إلى سلسلة التنسيق.
 android:text="@{@string/quote_format(gameViewModel.word)}"

دورة Udacity التدريبية:

مستندات مطوّري تطبيقات Android:

يسرد هذا القسم مهامًا منزلية محتملة للطلاب الذين يعملون على هذا الدرس التطبيقي العملي كجزء من دورة تدريبية يقودها مدرّب. على المعلّم تنفيذ ما يلي:

  • حدِّد واجبًا منزليًا إذا لزم الأمر.
  • توضيح كيفية إرسال الواجبات المنزلية للطلاب
  • وضع درجات للواجبات المنزلية

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

إذا كنت تعمل على هذا الدرس العملي بنفسك، يمكنك استخدام مهام الواجب المنزلي هذه لاختبار معلوماتك.

الإجابة عن هذه الأسئلة

السؤال 1

أيّ من العبارات التالية غير صحيحة بشأن عمليات ربط معالجات الأحداث؟

  • عمليات ربط معالِج الأحداث هي تعبيرات ربط يتم تنفيذها عند وقوع حدث.
  • تعمل عمليات ربط معالِجات الأحداث مع جميع إصدارات المكوّن الإضافي لنظام Gradle المتوافق مع Android.
  • تتم كتابة عمليات ربط معالِج الأحداث كتعبيرات lambda.
  • تشبه عمليات ربط معالِجات الأحداث مراجع الطرق، ولكنّها تتيح لك تنفيذ تعبيرات عشوائية لربط البيانات.

السؤال 2

لنفترض أنّ تطبيقك يتضمّن مورد السلسلة هذا:
<string name="generic_name">Hello %s</string>

أي مما يلي يمثّل بنية الجملة الصحيحة لتنسيق السلسلة باستخدام تعبير ربط البيانات؟

  • android:text= "@{@string/generic_name(user.name)}"
  • android:text= "@{string/generic_name(user.name)}"
  • android:text= "@{@generic_name(user.name)}"
  • android:text= "@{@string/generic_name,user.name}"

السؤال 3

متى يتم تقييم تعبير ربط معالج الأحداث وتنفيذه؟

  • عندما يتم تغيير البيانات التي يحتفظ بها LiveData
  • عند إعادة إنشاء نشاط بسبب تغيير في الإعدادات
  • عند وقوع حدث مثل onClick()
  • عندما ينتقل النشاط إلى الخلفية

ابدأ الدرس التالي: 5.4: عمليات تحويل LiveData

للحصول على روابط تؤدي إلى دروس تطبيقية أخرى في هذه الدورة التدريبية، اطّلِع على الصفحة المقصودة الخاصة بالدروس التطبيقية حول أساسيات Android Kotlin.