این کد لبه بخشی از دوره آموزشی 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 قبلی ساختهاید بهعنوان کد شروع استفاده کنید، یا میتوانید یک برنامه شروع را دانلود کنید.
- (اختیاری) اگر از کد خود از کد آزمایشگاه قبلی استفاده نمی کنید، کد شروع را برای این کد لبه دانلود کنید . کد را از حالت فشرده خارج کرده و پروژه را در Android Studio باز کنید.
- برنامه را اجرا کنید و بازی را انجام دهید.
- توجه داشته باشید که دکمه Got It کلمه بعدی را نشان می دهد و امتیاز را یک بار افزایش می دهد در حالی که دکمه Skip کلمه بعدی را نشان می دهد و امتیاز را یک کاهش می دهد. دکمه پایان بازی بازی را به پایان می رساند.
- تمام کلمات را دور بزنید و توجه کنید که برنامه به طور خودکار به صفحه امتیاز حرکت می کند.
در یک کد لبه قبلی، از اتصال داده به عنوان روشی مطمئن برای دسترسی به نماها در برنامه 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
مرتبط می کنید.
- در فایل
game_fragment.xml
، یک متغیر اتصال داده از نوعGameViewModel
اضافه کنید. اگر در اندروید استودیو خطایی دارید، پروژه را تمیز و بازسازی کنید.
<layout ...>
<data>
<variable
name="gameViewModel"
type="com.example.android.guesstheword.screens.game.GameViewModel" />
</data>
<androidx.constraintlayout...
- در فایل
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
جایگزین میکنید.
- در
game_fragment.xml
، ویژگیonClick
را بهskip_button
اضافه کنید. یک عبارت binding تعریف کنید و متد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
تنظیم می کند، حذف کنید. اگر اندروید استودیو خطایی نشان داد، پروژه را تمیز و بازسازی کنید.
کد برای حذف:
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }
- برنامه خود را اجرا کنید برنامه باید مانند قبل کار کند، اما اکنون نماهای دکمه مستقیماً با اشیاء
ViewModel
ارتباط برقرار می کنند. نماها دیگر از طریق کنترل کننده های کلیک دکمه درScoreFragment
ارتباط برقرار نمی کنند.
عیب یابی پیام های خطای اتصال داده ها
هنگامی که یک برنامه از اتصال داده استفاده می کند، فرآیند کامپایل کلاس های میانی ایجاد می کند که برای اتصال داده استفاده می شود. یک برنامه ممکن است خطاهایی داشته باشد که Android Studio تا زمانی که برنامه را کامپایل نکنید آنها را شناسایی نمی کند، بنابراین هنگام نوشتن کد، اخطار یا کد قرمز را مشاهده نمی کنید. اما در زمان کامپایل، شما خطاهای رمزی را دریافت می کنید که از کلاس های متوسط تولید شده می آیند.
اگر یک پیام خطای مرموز دریافت کردید:
- به پیام موجود در قسمت Android Studio Build با دقت نگاه کنید. اگر مکانی را مشاهده کردید که به
databinding
ختم میشود، خطای اتصال داده وجود دارد. - در فایل XML طرحبندی، خطاهایی را در ویژگیهای
onClick
که از اتصال داده استفاده میکنند، بررسی کنید. به دنبال تابعی باشید که عبارت lambda فراخوانی می کند و از وجود آن اطمینان حاصل کنید. - در بخش
<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
متصل میکنید.
- در
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
یک رشته خالی نمایش می دهد.
- در
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
، ناظرword
LiveData
را حذف کنید.
کد برای حذف:
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
- برنامه خود را اجرا کنید و بازی را انجام دهید. اکنون کلمه فعلی بدون روش ناظر در کنترلر UI به روز می شود.
مرحله 2: امتیاز LiveData را به فایل score_fragment.xml اضافه کنید
در این مرحله، score
LiveData
را به نمای متن امتیاز در قطعه امتیاز متصل میکنید.
- در
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
به عنوان منبع اتصال داده استفاده کردهاید تا به طور خودکار تغییرات در دادهها را به 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()
رخ می دهد - وقتی فعالیت به پسزمینه میرود
درس بعدی را شروع کنید:
برای پیوند به سایر کدهای این دوره، به صفحه فرود کد لبههای کد پایه Android Kotlin Fundamentals مراجعه کنید.