يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات 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
.
في الدرس التطبيقي حول الترميز، يمكنك تطوير تطبيق GuessTheWord الذي يبدأ برمز التفعيل. GuessTheWord هي لعبة من فئة charades ثنائية اللاعبين، حيث يتعاون اللاعبون لتحقيق أعلى نتيجة ممكنة.
ينظر اللاعب الأول إلى الكلمات في التطبيق ويدور كل منها بدوره، مع التأكد من عدم عرض الكلمة على اللاعب الثاني. يحاول اللاعب الثاني تخمين الكلمة.
لتشغيل اللعبة، يفتح المشغِّل الأول التطبيق على الجهاز ويرى كلمة، على سبيل المثال "غيتار&"& كما يظهر في لقطة الشاشة أدناه.
يمارس اللاعب الأول الكلمة، مع الحرص على عدم قول الكلمة نفسها في الواقع.
- عندما يخمّن اللاعب الثاني الكلمة بشكلٍ صحيح، يضغط اللاعب الأول على الزر حسنًا، ما يؤدي إلى زيادة العدد بمقدار كلمة واحدة وعرض الكلمة التالية.
- إذا لم يتمكّن المشغّل الثاني من تخمين الكلمة، يضغط اللاعب الأول على الزر التخطّي، ما يؤدي إلى خفض العدد بمقدار كلمة واحدة والانتقال إلى الكلمة التالية.
- لإنهاء اللعبة، اضغط على زر إنهاء اللعبة. (هذه الوظيفة ليست في رمز بدء الدرس التطبيقي للترميز الأول في السلسلة).
في هذا الدرس التطبيقي حول الترميز، يمكنك تحسين تطبيق GuessTheWord من خلال دمج ربط البيانات بعنصر LiveData
في كائنات ViewModel
. يعمل هذا على التشغيل المبرمَج بين طرق العرض في التنسيق وكائنات ViewModel
، ويسمح لك بتبسيط الرمز باستخدام LiveData
.
شاشة العنوان | شاشة اللعبة | شاشة النتائج |
في هذه المَهمّة، يمكنك تحديد مكان رمز تفعيل هذا الدرس التطبيقي وتشغيله. يمكنك استخدام تطبيق GuessTheWord الذي أنشأته في الدرس التطبيقي السابق كرمز للمبتدئين، أو يمكنك تنزيل تطبيق للمبتدئين.
- (اختياري) في حال عدم استخدام الرمز من الدرس التطبيقي السابق، يُرجى تنزيل رمز التفعيل لهذا الدرس التطبيقي. فكّ ضغط الرمز وافتح المشروع في Android Studio.
- شغِّل التطبيق وشغِّل اللعبة.
- لاحظ أن زر حسنًا يعرض الكلمة التالية ويزيد النتيجة بمقدار كلمة رئيسية بينما يعرض الزر تخط الكلمة التالية ويقلل النتيجة بمقدار كلمة رئيسية واحدة. يؤدي النقر على زر إنهاء اللعبة إلى إنهاء اللعبة.
- تنقَّل بين الكلمات، ولاحظ أن التطبيق ينتقل تلقائيًا إلى شاشة النتائج.
في درس تطبيقي سابق حول الترميز، استخدمتَ ربط البيانات كوسيلة آمنة للوصول إلى طرق العرض في تطبيق GuessTheWord، ولكن القدرة الفعلية لربط البيانات هي وظيفتها المقترحة: البيانات المُلزِمة مباشرةً بكائنات العرض في تطبيقك.
البنية الحالية للتطبيق
في تطبيقك، يتم تحديد الملفات الشخصية في تنسيق XML، ويتم الاحتفاظ ببيانات هذه الملفات الشخصية في عناصر ViewModel
. بين كل ملف شخصي وViewModel
المطابق هو وحدة تحكم في واجهة المستخدم، تعمل كترحيل بينها.
مثلاً:
- والزر حسنًا هو تعريف
Button
في ملف تنسيقgame_fragment.xml
. - عندما ينقر المستخدم على الزر حسنًا، يستدعي المستمع في الجزء
GameFragment
المستمع مقابل النقر فيGameViewModel
. - يتم تعديل النتيجة في
GameViewModel
.
لا يتواصل عرض Button
وGameViewModel
معًا مباشرةً، حيث يحتاجان إلى المستمع الذي ينقر عليه في GameFragment
.
تمرير بيانات النموذج في ربط البيانات
سيكون الأمر أكثر بساطة إذا تواصلت الملفات الشخصية في التنسيق مباشرةً مع البيانات في كائنات ViewModel
، بدون الاعتماد على وحدات تحكم واجهة المستخدم كوسطاء.
تحتفظ كائنات ViewModel
بجميع بيانات واجهة المستخدم في تطبيق GuessTheWord. ومن خلال تمرير كائنات ViewModel
إلى ربط البيانات، يمكنك برمجة بعض الاتصال بين الملفات الشخصية وكائنات ViewModel
.
في هذه المهمة، يمكنك ربط الصفين GameViewModel
وScoreViewModel
بتنسيقات XML المقابلة. ويمكنك أيضًا إعداد عمليات ربط المستمع للتعامل مع أحداث النقر.
الخطوة 1: إضافة ربط البيانات لنموذج GameView
في هذه الخطوة، يتم ربط 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 أو إصدار أحدث من المكوّن الإضافي Android Gradle Plugin. للتعرّف على مزيد من المعلومات، يُرجى الاطّلاع على التنسيقات والتعبيرات المُلزِمة.
في هذه الخطوة، يمكنك استبدال أدوات معالجة النقرات في 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: إضافة ربط البيانات لنموذج ScoreView
في هذه الخطوة، يتم ربط 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" إلى أن تحاول تجميع التطبيق، لكي لا تظهر لك تحذيرات أو رمز أحمر أثناء كتابة الرمز. ولكن في وقت التجميع، تظهر لك أخطاء مشفّرة واردة من الصفوف المتوسطة التي تم إنشاؤها.
إذا تلقيت رسالة خطأ مشفرة:
- اطّلِع بعناية على الرسالة في جزء الإصدار من "استوديو 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" أخطاء من هذه النوعية إلى أن تجمِّع التطبيق، ثم يعرض برنامج التجميع رسالة خطأ كما يلي:
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 إلى ملفأ_النتيجة.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 Studio: GuessTheWord
- تعمل"مكتبة ربط البيانات"بسلاسة مع"مكوِّنات بنية Android"، مثل
ViewModel
وLiveData
. - يمكن ربط التنسيقات في تطبيقك بالبيانات الموجودة في "مكونات البنية"، والتي تساعدك مسبقًا في إدارة مراحل نشاط وحدة التحكم في واجهة المستخدم والإشعار بالتغييرات التي تطرأ على البيانات.
ربط بيانات النماذج
- يمكنك ربط
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
أي من العبارات التالية غير صحيحة بشأن روابط المستمعين؟
- روابط المستمعين هي تعبيرات ملزِمة يتم تشغيلها عند وقوع حدث.
- تعمل روابط المستمعين مع جميع إصدارات مكوّن Android Gradle الإضافي.
- تتم كتابة روابط المستمعين كتعبيرات 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()
- عندما يظهر النشاط في الخلفية
بدء الدرس التالي:
وللحصول على روابط إلى دروس تطبيقية أخرى حول الترميز في هذه الدورة التدريبية، يُرجى الاطّلاع على الصفحة المقصودة لتطبيق الدروس التطبيقية حول الترميز Kotlin Fundamentals.