هذا الدرس التطبيقي حول الترميز هو جزء من دورة "أساسيات 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
، أزِل المراقب منLiveData
word
.
الرمز المطلوب إزالته:
/** 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.