هذا الدرس التطبيقي حول الترميز هو جزء من دورة "أساسيات Android Kotlin". يمكنك تحقيق أقصى استفادة من هذه الدورة التدريبية إذا اتبعت ترتيب الخطوات في دروس البرمجة. يتم إدراج جميع الدروس التطبيقية حول الترميز الخاصة بالدورة التدريبية في الصفحة المقصودة للدروس التطبيقية حول الترميز في دورة Android Kotlin Fundamentals.
مقدمة
في الدروس البرمجية السابقة في هذا الدرس، حسّنت رمز تطبيق GuessTheWord. يستخدم التطبيق الآن عناصر ViewModel، لذا تظل بيانات التطبيق محفوظة عند إجراء تغييرات في إعدادات الجهاز، مثل تدوير الشاشة وتغيير حالة توفّر لوحة المفاتيح. أضفت أيضًا LiveData قابلاً للملاحظة، لذا يتم إعلام طرق العرض تلقائيًا عند تغيُّر البيانات التي تتم ملاحظتها.
في هذا الدرس العملي، ستواصل العمل على تطبيق GuessTheWord. ستربط طرق العرض بفئات ViewModel في التطبيق حتى تتواصل طرق العرض في التصميم مباشرةً مع عناصر ViewModel. (حتى الآن في تطبيقك، كانت طرق العرض تتواصل بشكل غير مباشر مع ViewModel، وذلك من خلال أجزاء التطبيق). بعد دمج ربط البيانات مع عناصر ViewModel، لن تحتاج إلى معالجات النقر في أجزاء التطبيق، لذا يمكنك إزالتها.
يمكنك أيضًا تغيير تطبيق GuessTheWord لاستخدام LiveData كمصدر ربط البيانات لإعلام واجهة المستخدم بالتغييرات في البيانات، بدون استخدام طرق مراقبة LiveData.
ما يجب معرفته
- كيفية إنشاء تطبيقات Android أساسية في Kotlin
- طريقة عمل دورات حياة الأنشطة والتقسيمات
- كيفية استخدام عناصر
ViewModelفي تطبيقك - كيفية تخزين البيانات باستخدام
LiveDataفيViewModel - كيفية إضافة طرق مراقبة لتتبُّع التغييرات في بيانات
LiveData
أهداف الدورة التعليمية
- كيفية استخدام عناصر مكتبة ربط البيانات
- كيفية دمج
ViewModelمع ربط البيانات - كيفية دمج
LiveDataمع ربط البيانات - كيفية استخدام عمليات ربط معالِجات الأحداث لاستبدال معالِجات الأحداث في جزء
- كيفية إضافة تنسيق السلسلة إلى تعبيرات ربط البيانات
الإجراءات التي ستنفذّها
- تتواصل طرق العرض في تخطيطات GuessTheWord بشكل غير مباشر مع عناصر
ViewModel، وذلك باستخدام أدوات التحكّم في واجهة المستخدم (اللقطات) لنقل المعلومات. في هذا الدرس العملي، ستربط طرق عرض التطبيق بكائناتViewModelلكي تتواصل طرق العرض مباشرةً مع كائناتViewModel. - تغيير التطبيق لاستخدام
LiveDataكمصدر لربط البيانات بعد هذا التغيير، تُعلِم عناصرLiveDataواجهة المستخدم بالتغييرات في البيانات، ولن تعود هناك حاجة إلى طرق مراقبةLiveData.
في دروس الترميز التطبيقية في الدرس 5، ستطوّر تطبيق GuessTheWord، بدءًا من الرموز البرمجية للمبتدئين. GuessTheWord هي لعبة تمثيل لشخصيات من لاعبَين، حيث يتعاون اللاعبان لتحقيق أعلى نتيجة ممكنة.
ينظر اللاعب الأول إلى الكلمات في التطبيق ويمثّل كل كلمة بالتناوب، مع الحرص على عدم إظهار الكلمة للاعب الثاني. يحاول اللاعب الثاني تخمين الكلمة.
لبدء اللعبة، يفتح اللاعب الأول التطبيق على الجهاز ويظهر له كلمة، مثل "غيتار"، كما هو موضّح في لقطة الشاشة أدناه.
يؤدي اللاعب الأول الكلمة، مع الحرص على عدم قول الكلمة نفسها.
- عندما يخمن اللاعب الثاني الكلمة بشكل صحيح، يضغط اللاعب الأول على الزر فهمت، ما يؤدي إلى زيادة العدد بمقدار واحد وعرض الكلمة التالية.
- إذا لم يتمكّن اللاعب الثاني من تخمين الكلمة، ينقر اللاعب الأول على زر تخطّي، ما يؤدي إلى خفض العدد بمقدار واحد والانتقال إلى الكلمة التالية.
- لإنهاء اللعبة، اضغط على الزر إنهاء اللعبة. (لا تتوفّر هذه الوظيفة في الرمز الأولي لأول درس برمجي في السلسلة).
في هذا الدرس العملي، ستعمل على تحسين تطبيق GuessTheWord من خلال دمج ربط البيانات مع LiveData في عناصر ViewModel. تؤدي هذه العملية إلى إتمام عملية التواصل بين طرق العرض في التصميم وعناصر ViewModel تلقائيًا، كما تتيح لك تبسيط الرمز البرمجي باستخدام LiveData.
شاشة العنوان |
شاشة اللعبة |
شاشة النتيجة |
في هذه المهمة، ستحدّد موقع الرمز الأولي لهذا الدرس التطبيقي حول الترميز وتشغّله. يمكنك استخدام تطبيق GuessTheWord الذي أنشأته في الدرس العملي السابق كرمز أولي، أو يمكنك تنزيل تطبيق أولي.
- (اختياري) إذا كنت لا تستخدم الرمز من الدرس التطبيقي السابق حول الترميز، يمكنك تنزيل رمز البداية لهذا الدرس التطبيقي حول الترميز. فك ضغط الرمز البرمجي، وافتح المشروع في "استوديو Android".
- شغِّل التطبيق واللعبة.
- يُرجى العِلم أنّ الزر حسنًا يعرض الكلمة التالية ويزيد النتيجة بمقدار واحد، بينما يعرض الزر تخطّي الكلمة التالية ويقلّل النتيجة بمقدار واحد. يؤدي النقر على الزر إنهاء اللعبة إلى إنهاء اللعبة.
- تنقَّل بين جميع الكلمات، ولاحظ أنّ التطبيق ينتقل تلقائيًا إلى شاشة النتائج.
في تجربة عملية سابقة، استخدمت ربط البيانات كطريقة آمنة للوصول إلى طرق العرض في تطبيق 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.
- في الملف
game_fragment.xml، أضِف متغيّر ربط بيانات من النوعGameViewModel. إذا ظهرت لك أخطاء في "استوديو Android"، عليك تنظيف المشروع وإعادة إنشائه.
<layout ...>
<data>
<variable
name="gameViewModel"
type="com.example.android.guesstheword.screens.game.GameViewModel" />
</data>
<androidx.constraintlayout...
- في الملف
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.
- في
game_fragment.xml، أضِف السمةonClickإلىskip_button. حدِّد تعبير ربط واستدعِ طريقةonSkip()فيGameViewModel. يُطلق على تعبير الربط هذا اسم ربط المستمع.
<Button
android:id="@+id/skip_button"
...
android:onClick="@{() -> gameViewModel.onSkip()}"
... />- وبالمثل، اربط حدث النقر على
correct_buttonبالطريقةonCorrect()فيGameViewModel.
<Button
android:id="@+id/correct_button"
...
android:onClick="@{() -> gameViewModel.onCorrect()}"
... />- اربط حدث النقر على
end_game_buttonبالطريقةonGameFinish()فيGameViewModel.
<Button
android:id="@+id/end_game_button"
...
android:onClick="@{() -> gameViewModel.onGameFinish()}"
... />- في
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.
- في الملف
score_fragment.xml، أضِف متغيّر ربط من النوعScoreViewModel. تشبه هذه الخطوة ما فعلته معGameViewModelأعلاه.
<layout ...>
<data>
<variable
name="scoreViewModel"
type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout- في
score_fragment.xml، أضِف السمةonClickإلىplay_again_button. حدِّد ربط معالج الأحداث واستدعِ طريقةonPlayAgain()فيScoreViewModel.
<Button
android:id="@+id/play_again_button"
...
android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
... />- في
ScoreFragment، داخلonCreateView()، ابدأviewModel. بعد ذلك، عليك تهيئة متغير الربطbinding.scoreViewModel.
viewModel = ...
binding.scoreViewModel = viewModel- في
ScoreFragment، أزِل الرمز الذي يضبط أداة معالجة النقرات لعنصرplayAgainButton. إذا عرض "استوديو Android" خطأً، نظِّف المشروع وأعِد إنشاءه.
الرمز المطلوب إزالته:
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }- شغِّل تطبيقك. من المفترض أن يعمل التطبيق كما كان من قبل، ولكن الآن تتواصل طرق عرض الأزرار مباشرةً مع عناصر
ViewModel. لم تعُد طرق العرض تتواصل من خلال معالجات النقر على الأزرار فيScoreFragment.
تحديد المشاكل في رسائل الخطأ المتعلقة بربط البيانات وحلّها
عندما يستخدم تطبيق ربط البيانات، تنشئ عملية التجميع فئات وسيطة تُستخدَم لربط البيانات. يمكن أن يتضمّن التطبيق أخطاء لا يرصدها Android Studio إلى أن تحاول تجميع التطبيق، لذا لا تظهر لك تحذيرات أو رمز أحمر أثناء كتابة الرمز. ولكن عند وقت التجميع، ستتلقّى أخطاء غامضة مصدرها الفئات الوسيطة التي تم إنشاؤها.
إذا ظهرت لك رسالة خطأ غير واضحة، اتّبِع الخطوات التالية:
- انظر بعناية إلى الرسالة في لوحة الإنشاء في "استوديو Android". إذا رأيت موقعًا جغرافيًا ينتهي بـ
databinding، يعني ذلك حدوث خطأ في ربط البيانات. - في ملف XML الخاص بالتصميم، ابحث عن أخطاء في سمات
onClickالتي تستخدم ربط البيانات. ابحث عن الدالة التي يستدعيها تعبير lambda وتأكَّد من أنّها متوفّرة. - في القسم
<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.
- في
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 سلسلة فارغة.
- في
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- في
GameFragment، أزِل المراقب منLiveDataword.
الرمز المطلوب إزالته:
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})- شغِّل تطبيقك والعب اللعبة. يتم الآن تعديل الكلمة الحالية بدون طريقة مراقبة في وحدة التحكّم في واجهة المستخدم.
الخطوة 2: إضافة LiveData الخاصة بالنتيجة إلى ملف score_fragment.xml
في هذه الخطوة، عليك ربط LiveData score بعرض نص النتيجة في جزء النتيجة.
- في
score_fragment.xml، أضِف السمةandroid:textإلى طريقة عرض نص النتيجة. عيِّنscoreViewModel.scoreللسمةtext. بما أنّscoreهو عدد صحيح، عليك تحويله إلى سلسلة باستخدامString.valueOf().
<TextView
android:id="@+id/score_text"
...
android:text="@{String.valueOf(scoreViewModel.score)}"
... />- في
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- في
ScoreFragment، أزِل أداة المراقبة للعنصرscore.
الرمز المطلوب إزالته:
// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})- شغِّل تطبيقك والعب اللعبة. لاحظ أنّ النتيجة في جزء النتيجة يتم عرضها بشكل صحيح، بدون مراقب في جزء النتيجة.
الخطوة 3: إضافة تنسيق السلسلة باستخدام ربط البيانات
في التنسيق، يمكنك إضافة تنسيق السلسلة مع ربط البيانات. في هذه المهمة، ستنسّق الكلمة الحالية لإضافة علامات اقتباس حولها. يمكنك أيضًا تنسيق سلسلة النتائج لإضافة البادئة النتيجة الحالية إليها، كما هو موضّح في الصورة التالية.

- في
string.xml، أضِف السلاسل التالية التي ستستخدمها لتنسيق طرق عرض النصwordوscore.%sو%dهما العنصران النائبان للكلمة الحالية والنتيجة الحالية.
<string name="quote_format">\"%s\"</string>
<string name="score_format">Current Score: %d</string>- في
game_fragment.xml، عدِّل السمةtextلعرض النصword_textلاستخدام مورد السلسلةquote_format. النجاح فيgameViewModel.wordيؤدي ذلك إلى تمرير الكلمة الحالية كوسيطة إلى سلسلة التنسيق.
<TextView
android:id="@+id/word_text"
...
android:text="@{@string/quote_format(gameViewModel.word)}"
... />- نسِّق طريقة عرض النص
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)}"
... />- في الفئة
GameFragment، داخل طريقةonCreateView()، أزِل رمز المراقبscore.
الرمز المطلوب إزالته:
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})- نظِّف تطبيقك وأعِد إنشائه وشغِّله، ثم العب اللعبة. لاحظ أنّه يتم تنسيق الكلمة الحالية والنتيجة في شاشة اللعبة.

تهانينا! لقد دمجت 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() - عندما ينتقل النشاط إلى الخلفية
ابدأ الدرس التالي:
للحصول على روابط تؤدي إلى دروس تطبيقية أخرى في هذه الدورة التدريبية، اطّلِع على الصفحة المقصودة الخاصة بالدروس التطبيقية حول أساسيات Android Kotlin.


