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>

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 به‌عنوان منبع اتصال داده‌ها برای اطلاع دادن به 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 null باشد، شی 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 کار می کند.
  • طرح‌بندی‌های موجود در برنامه شما می‌توانند به داده‌های موجود در اجزای معماری متصل شوند، که از قبل به شما کمک می‌کنند تا چرخه عمر کنترل‌کننده رابط کاربری را مدیریت کنید و در مورد تغییرات داده‌ها مطلع شوید.

اتصال داده ViewModel

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

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

  • در فایل طرح بندی، یک متغیر اتصال داده از نوع ViewModel اضافه کنید.
   <data>

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

صحافی شنونده

  • اتصالات شنونده عبارت‌های الزام‌آوری در طرح‌بندی هستند که هنگام فعال شدن رویدادهای کلیکی مانند 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 مراجعه کنید.