Android Kotlin Fundamentals 05.3: ربط البيانات بعرض البيانات ونماذج LiveData

يشكّل هذا الدرس التطبيقي جزءًا من الدورة التدريبية لأساسيات 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 الذي أنشأته في الدرس التطبيقي السابق كرمز للمبتدئين، أو يمكنك تنزيل تطبيق للمبتدئين.

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

في درس تطبيقي سابق حول الترميز، استخدمتَ ربط البيانات كوسيلة آمنة للوصول إلى طرق العرض في تطبيق 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.

  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 أو إصدار أحدث من المكوّن الإضافي Android Gradle Plugin. للتعرّف على مزيد من المعلومات، يُرجى الاطّلاع على التنسيقات والتعبيرات المُلزِمة.

في هذه الخطوة، يمكنك استبدال أدوات معالجة النقرات في 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: إضافة ربط البيانات لنموذج ScoreView

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

إذا تلقيت رسالة خطأ مشفرة:

  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" أخطاء من هذه النوعية إلى أن تجمِّع التطبيق، ثم يعرض برنامج التجميع رسالة خطأ كما يلي:

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 إلى ملفأ_النتيجة.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 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()
  • عندما يظهر النشاط في الخلفية

بدء الدرس التالي: 5.4: LiveData Transforms

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