Android Kotlin Fundamentals 05.3: اتصال داده با ViewModel و LiveData

این کد لبه بخشی از دوره آموزشی Android Kotlin Fundamentals است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. همه کدهای دوره در صفحه فرود کد لبه های کدهای Android Kotlin Fundamentals فهرست شده اند.

مقدمه

در کدهای قبلی در این درس، کد برنامه GuessTheWord را بهبود بخشیدید. این برنامه اکنون از اشیاء ViewModel استفاده می کند، بنابراین داده های برنامه از تغییرات پیکربندی دستگاه مانند چرخش صفحه و تغییرات در دسترس بودن صفحه کلید زنده می مانند. شما همچنین LiveData قابل مشاهده را اضافه کرده اید، بنابراین هنگام تغییر داده های مشاهده شده، نماها به طور خودکار مطلع می شوند.

در این کد لبه، شما به کار با برنامه GuessTheWord ادامه می دهید. شما نماها را به کلاس های ViewModel در برنامه متصل می کنید تا نماهای موجود در طرح شما مستقیماً با اشیاء ViewModel ارتباط برقرار کنند. (تاکنون در برنامه شما، نماها به طور غیرمستقیم با ViewModel از طریق قطعات برنامه ارتباط برقرار می کردند.) پس از اینکه پیوند داده را با اشیاء ViewModel ادغام کردید، دیگر نیازی به کنترل کننده کلیک در قطعات برنامه ندارید، بنابراین آنها را حذف می کنید.

همچنین می‌توانید برنامه GuessTheWord را تغییر دهید تا از LiveData به‌عنوان منبع اتصال داده‌ها برای اطلاع دادن به UI در مورد تغییرات داده‌ها، بدون استفاده از روش‌های ناظر LiveData استفاده کند.

آنچه از قبل باید بدانید

  • نحوه ایجاد برنامه های اساسی اندروید در Kotlin.
  • چرخه های حیاتی فعالیت و قطعه چگونه کار می کنند.
  • نحوه استفاده از اشیاء ViewModel در برنامه خود
  • نحوه ذخیره داده ها با استفاده از LiveData در ViewModel .
  • نحوه اضافه کردن متدهای مشاهدهگر برای مشاهده تغییرات در داده های LiveData .

چیزی که یاد خواهید گرفت

  • نحوه استفاده از عناصر کتابخانه Data Binding .
  • نحوه ادغام ViewModel با Data Binding.
  • نحوه ادغام LiveData با اتصال داده
  • نحوه استفاده از اتصالات شنونده برای جایگزینی شنوندگان کلیک در یک قطعه.
  • نحوه اضافه کردن قالب بندی رشته به عبارات اتصال داده

کاری که خواهی کرد

  • نماها در طرح‌بندی‌های GuessTheWord به‌طور غیرمستقیم با اشیاء ViewModel ارتباط برقرار می‌کنند و از کنترل‌کننده‌های UI (قطعات) برای انتقال اطلاعات استفاده می‌کنند. در این لبه کد، نماهای برنامه را به اشیاء ViewModel متصل می کنید تا نماها مستقیماً با اشیاء ViewModel ارتباط برقرار کنند.
  • شما برنامه را تغییر می دهید تا از LiveData به عنوان منبع اتصال داده استفاده کند. پس از این تغییر، اشیاء LiveData به UI در مورد تغییرات داده ها اطلاع می دهند و دیگر به روش های مشاهده LiveData نیازی نیست.

در بخش کدهای درس 5، برنامه GuessTheWord را توسعه می‌دهید که با کد شروع شروع می‌شود. GuessTheWord یک بازی دو نفره به سبک charades است که در آن بازیکنان برای دستیابی به بالاترین امتیاز ممکن با یکدیگر همکاری می کنند.

بازیکن اول به کلمات موجود در برنامه نگاه می کند و هر کدام را به نوبه خود عمل می کند و مطمئن می شود که کلمه را به بازیکن دوم نشان نمی دهد. بازیکن دوم سعی می کند کلمه را حدس بزند.

برای انجام بازی، اولین بازیکن برنامه را روی دستگاه باز می کند و کلمه ای را می بیند، به عنوان مثال "گیتار"، همانطور که در تصویر زیر نشان داده شده است.

اولین بازیکن کلمه را اجرا می کند و مراقب است که در واقع خود کلمه را نگوید.

  • وقتی بازیکن دوم کلمه را به درستی حدس زد، بازیکن اول دکمه Got It را فشار می دهد که تعداد را یک عدد افزایش می دهد و کلمه بعدی را نشان می دهد.
  • اگر بازیکن دوم نتواند کلمه را حدس بزند، بازیکن اول دکمه Skip را فشار می‌دهد که تعداد را یک کاهش می‌دهد و به کلمه بعدی می‌رود.
  • برای پایان بازی، دکمه پایان بازی را فشار دهید. (این قابلیت در کد شروع برای اولین آزمایشگاه کد در سری نیست.)

در این لبه کد، برنامه GuessTheWord را با ادغام پیوند داده با LiveData در اشیاء ViewModel بهبود می‌بخشید. این امر ارتباط بین نماهای موجود در طرح و اشیاء ViewModel را خودکار می کند و به شما امکان می دهد کد خود را با استفاده از LiveData ساده کنید.

صفحه عنوان

صفحه نمایش بازی

صفحه نمایش امتیاز

در این کار، کد شروع خود را برای این کد لبه پیدا کرده و اجرا می کنید. می‌توانید از برنامه GuessTheWord که در Codelab قبلی ساخته‌اید به‌عنوان کد شروع استفاده کنید، یا می‌توانید یک برنامه شروع را دانلود کنید.

  1. (اختیاری) اگر از کد خود از کد آزمایشگاه قبلی استفاده نمی کنید، کد شروع را برای این کد لبه دانلود کنید. کد را از حالت فشرده خارج کرده و پروژه را در Android Studio باز کنید.
  2. برنامه را اجرا کنید و بازی را انجام دهید.
  3. توجه داشته باشید که دکمه Got It کلمه بعدی را نشان می دهد و امتیاز را یک بار افزایش می دهد در حالی که دکمه Skip کلمه بعدی را نمایش می دهد و امتیاز را یک کاهش می دهد. دکمه پایان بازی بازی را به پایان می رساند.
  4. تمام کلمات را دور بزنید و توجه کنید که برنامه به طور خودکار به صفحه امتیاز حرکت می کند.

در یک کد لبه قبلی، از اتصال داده به عنوان روشی مطمئن برای دسترسی به نماها در برنامه GuessTheWord استفاده کردید. اما قدرت واقعی اتصال داده در انجام کاری است که از نام آن نشان می‌دهد: اتصال مستقیم داده‌ها به اشیاء مشاهده در برنامه شما.

معماری فعلی اپلیکیشن

در برنامه شما، نماها در طرح‌بندی XML تعریف شده‌اند و داده‌های آن نماها در اشیاء ViewModel نگهداری می‌شوند. بین هر نما و ViewModel مربوط به آن یک کنترلر رابط کاربری وجود دارد که به عنوان یک رله بین آنها عمل می کند.

مثلا:

  • دکمه Got It به عنوان نمای Button در فایل طرح بندی game_fragment.xml شده است.
  • وقتی کاربر روی دکمه Got It ضربه می‌زند، یک شنونده کلیک در قطعه GameFragment ، شنونده کلیک مربوطه را در GameViewModel .
  • امتیاز در GameViewModel به روز می شود.

نمای Button و GameViewModel مستقیماً با هم ارتباط برقرار نمی کنند - آنها به شنونده کلیکی نیاز دارند که در GameFragment است.

ViewModel به data binding منتقل شد

اگر نماهای موجود در طرح‌بندی مستقیماً با داده‌های موجود در اشیاء ViewModel ارتباط برقرار کنند، بدون تکیه بر کنترل‌کننده‌های UI به عنوان واسطه، ساده‌تر خواهد بود.

اشیاء ViewModel تمام داده های رابط کاربری را در برنامه GuessTheWord نگه می دارند. با ارسال اشیاء ViewModel به اتصال داده، می توانید برخی از ارتباطات بین view ها و اشیاء ViewModel را خودکار کنید.

در این کار، کلاس های GameViewModel و ScoreViewModel را با طرح بندی XML متناظر آن ها مرتبط می کنید. همچنین اتصالات شنونده را برای مدیریت رویدادهای کلیک تنظیم می کنید.

مرحله 1: اتصال داده را برای GameViewModel اضافه کنید

در این مرحله، GameViewModel را با فایل طرح بندی مربوطه، game_fragment.xml می کنید.

  1. در فایل game_fragment.xml ، یک متغیر اتصال داده از نوع GameViewModel کنید. اگر در اندروید استودیو خطایی دارید، پروژه را تمیز و بازسازی کنید.
<layout ...>

   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  
   <androidx.constraintlayout...
  1. در فایل GameFragment ، GameViewModel را به data binding منتقل کنید.

    برای این کار، viewModel را به متغیر binding.gameViewModel که در مرحله قبل اعلام کردید، اختصاص دهید. این کد را پس از مقداردهی اولیه viewModel در onCreateView() قرار دهید. اگر در اندروید استودیو خطایی دارید، پروژه را تمیز و بازسازی کنید.
// Set the viewmodel for databinding - this allows the bound layout access 
// to all the data in the ViewModel
binding.gameViewModel = viewModel

مرحله 2: از اتصالات شنونده برای مدیریت رویداد استفاده کنید

Bindings شنونده عبارت‌های الزام‌آوری هستند که وقتی رویدادهایی مانند onClick() , onZoomIn() یا onZoomOut() راه اندازی می‌شوند اجرا می‌شوند. پیوندهای شنونده به صورت عبارات لامبدا نوشته می شوند.

اتصال داده ها یک شنونده ایجاد می کند و شنونده را در دید قرار می دهد. هنگامی که رویداد شنیده شده اتفاق می افتد، شنونده عبارت لامبدا را ارزیابی می کند. اتصالات شنونده با افزونه Android Gradle نسخه 2.0 یا بالاتر کار می کند. برای کسب اطلاعات بیشتر، Layouts and binding expressions را بخوانید.

در این مرحله، شنودهای کلیکی در GameFragment را با باندهای listener در فایل game_fragment.xml .

  1. در game_fragment.xml ، ویژگی onClick را به دکمه skip_button کنید. یک عبارت binding تعریف کنید و 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 تنظیم می‌کند، حذف کنید. اگر اندروید استودیو خطایی نشان داد، پروژه را پاک کرده و دوباره بسازید.

کد برای حذف:

binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. برنامه خود را اجرا کنید برنامه باید مانند قبل کار کند، اما اکنون نماهای دکمه مستقیماً با اشیاء ViewModel ارتباط برقرار می کنند. نماها دیگر از طریق کنترل کننده های کلیک دکمه در ScoreFragment ارتباط برقرار نمی کنند.

عیب یابی پیام های خطای اتصال داده ها

هنگامی که یک برنامه از اتصال داده استفاده می کند، فرآیند کامپایل کلاس های میانی ایجاد می کند که برای اتصال داده استفاده می شود. یک برنامه ممکن است دارای خطاهایی باشد که Android Studio تا زمانی که برنامه را کامپایل نکنید آنها را شناسایی نمی کند، بنابراین هنگام نوشتن کد، هشدار یا کد قرمزی را مشاهده نمی کنید. اما در زمان کامپایل، شما خطاهای رمزی را دریافت می کنید که از کلاس های متوسط ​​تولید شده می آیند.

اگر یک پیام خطای مرموز دریافت کردید:

  1. به پیام موجود در قسمت Android Studio Build با دقت نگاه کنید. اگر مکانی را مشاهده کردید که به databinding ، خطای اتصال داده وجود دارد.
  2. در فایل XML طرح‌بندی، خطاهایی را در ویژگی‌های onClick که از اتصال داده استفاده می‌کنند، بررسی کنید. به دنبال تابعی باشید که عبارت lambda فراخوانی می کند و مطمئن شوید که وجود دارد.
  3. در بخش <data> XML، املای متغیر data-binding را بررسی کنید.

به عنوان مثال، به غلط املایی نام تابع onCorrect() در مقدار مشخصه زیر توجه کنید:

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

همچنین به غلط املایی gameViewModel در بخش <data> فایل XML توجه کنید:

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

اندروید استودیو تا زمانی که برنامه را کامپایل نکنید، چنین خطاهایی را شناسایی نمی کند و سپس کامپایلر پیام خطایی مانند زیر را نشان می دهد:

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 به‌عنوان منبع اتصال داده‌ها برای اطلاع دادن به UI در مورد تغییرات داده‌ها، بدون استفاده از روش‌های مشاهده‌گر LiveData استفاده کند.

مرحله 1: کلمه LiveData را به فایل game_fragment.xml اضافه کنید

در این مرحله، نمای متن کلمه فعلی را مستقیماً به شی LiveData در ViewModel متصل می‌کنید.

  1. در game_fragment.xml ، ویژگی android:text را به نمای متن word_text کنید.

با استفاده از متغیر binding، gameViewModel ، آن را روی شی LiveData ، word از 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 ، ناظر word LiveData را حذف کنید.

کد برای حذف:

/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})
  1. برنامه خود را اجرا کنید و بازی را انجام دهید. اکنون کلمه فعلی بدون روش مشاهدهگر در کنترلر UI به روز می شود.

مرحله 2: امتیاز LiveData را به فایل score_fragment.xml اضافه کنید

در این مرحله، score LiveData را به نمای متن امتیاز در قطعه امتیاز متصل می‌کنید.

  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 به‌عنوان منبع اتصال داده استفاده کرده‌اید تا به طور خودکار تغییرات داده‌ها را به UI اطلاع دهد، بدون روش‌های مشاهده‌گر LiveData .

پروژه اندروید استودیو: GuessTheWord

  • کتابخانه Data Binding یکپارچه با اجزای معماری Android مانند ViewModel و LiveData کار می کند.
  • طرح‌بندی‌های موجود در برنامه شما می‌توانند به داده‌های موجود در اجزای معماری متصل شوند، که از قبل به شما کمک می‌کنند چرخه عمر کنترلر UI را مدیریت کنید و در مورد تغییرات داده‌ها مطلع شوید.

اتصال داده ViewModel

  • شما می توانید یک ViewModel را با یک طرح بندی با استفاده از اتصال داده مرتبط کنید.
  • اشیاء ViewModel داده های UI را نگه می دارند. با ارسال اشیاء ViewModel به اتصال داده، می توانید برخی از ارتباطات بین view ها و اشیاء ViewModel را خودکار کنید.

چگونه یک ViewModel را با یک طرح بندی مرتبط کنیم:

  • در فایل layout، یک متغیر data-binding از نوع ViewModel اضافه کنید.
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • در فایل GameFragment ، GameViewModel را به data binding منتقل کنید.
binding.gameViewModel = viewModel

صحافی شنونده

  • Bindings شنونده عبارت‌های الزام‌آور در طرح‌بندی هستند که هنگام فعال شدن رویدادهای کلیک مانند onClick() اجرا می‌شوند.
  • پیوندهای شنونده به صورت عبارات لامبدا نوشته می شوند.
  • با استفاده از اتصالات شنونده، شنوندگان کلیکی را در کنترلرهای UI با اتصالات شنونده در فایل طرح بندی جایگزین می کنید.
  • اتصال داده ها یک شنونده ایجاد می کند و شنونده را در دید قرار می دهد.
 android:onClick="@{() -> gameViewModel.onSkip()}"

افزودن LiveData به داده های binding

  • اشیاء LiveData را می توان به عنوان یک منبع اتصال داده استفاده کرد تا به طور خودکار تغییرات در داده ها را به UI اطلاع دهد.
  • می توانید نمای را مستقیماً به شی LiveData در ViewModel متصل کنید. وقتی LiveData در ViewModel تغییر می‌کند، نماهای موجود در طرح‌بندی را می‌توان به‌طور خودکار، بدون روش‌های مشاهده‌گر در کنترل‌کننده‌های UI، به‌روزرسانی کرد.
android:text="@{gameViewModel.word}"
  • برای اینکه داده LiveData کار کند، فعالیت فعلی (کنترل کننده UI) را به عنوان مالک چرخه حیات متغیر binding در کنترلر UI تنظیم کنید.
binding.lifecycleOwner = this

قالب بندی رشته با اتصال داده

  • با استفاده از اتصال داده، می توانید یک منبع رشته را با متغیرهایی مانند %s برای رشته ها و %d برای اعداد صحیح قالب بندی کنید.
  • برای به روز رسانی ویژگی text view، شی LiveData را به عنوان آرگومان به رشته قالب بندی ارسال کنید.
 android:text="@{@string/quote_format(gameViewModel.word)}"

دوره بی ادبی:

مستندات توسعه دهنده اندروید:

این بخش، تکالیف احتمالی را برای دانش‌آموزانی که در این آزمایشگاه کد به عنوان بخشی از دوره‌ای که توسط یک مربی هدایت می‌شود، فهرست می‌کند. این وظیفه مربی است که موارد زیر را انجام دهد:

  • در صورت نیاز تکالیف را تعیین کنید.
  • نحوه ارسال تکالیف را با دانش آموزان در میان بگذارید.
  • تکالیف را درجه بندی کنید.

مربیان می‌توانند از این پیشنهادات به اندازه‌ای که می‌خواهند استفاده کنند، و باید با خیال راحت هر تکلیف دیگری را که فکر می‌کنند مناسب است به آنها اختصاص دهند.

اگر به تنهایی بر روی این کدها کار می کنید، از این تکالیف برای آزمایش دانش خود استفاده کنید.

یه این سوالات پاسخ دهید

سوال 1

کدام یک از عبارات زیر در مورد صحافی شنونده صحیح نیست ؟

  • اتصالات شنونده عبارات الزام آور هستند که هنگام وقوع یک رویداد اجرا می شوند.
  • اتصالات شنونده با تمام نسخه های پلاگین Android Gradle کار می کند.
  • پیوندهای شنونده به صورت عبارات لامبدا نوشته می شوند.
  • اتصالات شنونده شبیه به مراجع متد است، اما به شما امکان می‌دهد عبارات اتصال داده دلخواه را اجرا کنید.

سوال 2

فرض کنید برنامه شما شامل این منبع رشته است:
<string name="generic_name">Hello %s</string>

کدام یک از موارد زیر برای قالب بندی رشته با استفاده از عبارت data-binding نحو صحیحی است؟

  • 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 Fundamentals مراجعه کنید.