‫Android Kotlin Fundamentals 02.2: הוספת אינטראקטיביות למשתמש

ה-codelab הזה הוא חלק מהקורס Android Kotlin Fundamentals. כדי להפיק את המרב מהקורס הזה, מומלץ לעבוד על ה-codelabs לפי הסדר. כל ה-codelab של הקורס מפורטים בדף הנחיתה של ה-codelab בנושא יסודות Kotlin ל-Android.

מה שכדאי לדעת

  • יצירת אפליקציית Android בסיסית ב-Kotlin.
  • הפעלת אפליקציית Android באמולטור או במכשיר.
  • יצירת פריסה לינארית באמצעות כלי הפריסה של Android Studio .
  • יצירת אפליקציה פשוטה שמשתמשת ב-LinearLayout, ב-TextView, ב-ScrollView ובלחצן עם handler לקליקים.

מה תלמדו

  • איך מקבלים קלט מהמשתמש באמצעות תצוגת EditText.
  • איך מגדירים טקסט לתצוגה TextView באמצעות הטקסט מהתצוגה EditText.
  • איך עובדים עם View ועם ViewGroup
  • איך משנים את החשיפה של View.

הפעולות שתבצעו:

  • להוסיף אינטראקטיביות לאפליקציה AboutMe, שהיא מ-codelab קודם.
  • מוסיפים EditText כדי שהמשתמש יוכל להזין טקסט.
  • מוסיפים Button ומטמיעים את click handler שלו.

ב-codelab הזה, מרחיבים את האפליקציה AboutMe כדי להוסיף אינטראקציה עם המשתמש. מוסיפים שדה לכינוי, לחצן סיום ותצוגת טקסט להצגת הכינוי. אחרי שהמשתמש מזין כינוי ומקיש על הלחצן סיום, תצוגת הטקסט מתעדכנת ומוצג בה הכינוי שהוזן. המשתמש יכול לעדכן שוב את הכינוי על ידי הקשה על תצוגת הטקסט.

האפליקציה 'מי אני'

במשימה הזו מוסיפים שדה קלט של EditText כדי לאפשר למשתמש להזין כינוי.

שלב 1: מתחילים

  1. אם אין לכם כבר את אפליקציית AboutMe מ-codelab קודם, מורידים את הקוד לתחילת הדרך, AboutMeInteractive-Starter. זה אותו קוד שסיימתם ב-codelab קודם.
  2. פותחים את הפרויקט AboutMeInteractive-Starter ב-Android Studio.
  3. מריצים את האפליקציה. מוצג תצוגת טקסט של שם, תמונת כוכב וקטע טקסט ארוך בתצוגת גלילה.



    שימו לב שהמשתמש לא יכול לשנות את הטקסט.

אפליקציות מעניינות יותר אם המשתמש יכול ליצור אינטראקציה עם האפליקציה, למשל אם הוא יכול להזין טקסט. כדי לקבל קלט טקסט, מערכת Android מספקת ווידג'ט של ממשק משתמש שנקרא edit text. מגדירים טקסט לעריכה באמצעות EditText, מחלקת משנה של TextView. שדה לעריכת טקסט מאפשר למשתמש להזין ולשנות קלט טקסט, כמו שמוצג בצילום המסך שלמטה.

שלב 2: מוסיפים רכיב EditText

  1. ב-Android Studio, פותחים את קובץ הפריסה activity_main.xml בכרטיסייה Design.
  2. בחלונית Palette, לוחצים על Text.



    Ab TextView, שהוא TextView, מופיע בחלק העליון של רשימת רכיבי הטקסט בחלונית Palette. מתחת ל-Ab TextView יש כמה תצוגות EditText.

    בחלון Palette, שימו לב שהסמל של TextView מציג את האותיות Ab ללא קו תחתון. לעומת זאת, בסמלים EditText מופיע Ab עם קו תחתון. הקו התחתון מציין שאפשר לערוך את התצוגה.

    לכל אחת מ-EditText התצוגות, מערכת Android מגדירה מאפיינים שונים, והמערכת מציגה את שיטת הקלט המתאימה (למשל מקלדת וירטואלית).
  3. גוררים את הטקסט לעריכה PlainText אל עץ הרכיבים וממקמים אותו מתחת ל-name_text ומעל star_image.


  4. משתמשים בחלונית Attributes (מאפיינים) כדי להגדיר את המאפיינים הבאים בתצוגה EditText.

מאפיין

ערך

id

nickname_edit

layout_width

match_parent (ברירת המחדל)

layout_height

wrap_content (ברירת המחדל)

  1. מריצים את האפליקציה. מעל תמונת הכוכב מופיע טקסט שאפשר לערוך, עם הטקסט שמוגדר כברירת מחדל 'שם'.


במשימה הזו, מעצבים את התצוגה EditText על ידי הוספת רמז, שינוי יישור הטקסט, שינוי הסגנון ל-NameStyle והגדרת סוג הקלט.

שלב 1: מוסיפים טקסט של רמז

  1. מוסיפים משאב מחרוזת חדש לרמז בקובץ string.xml.
<string name="what_is_your_nickname">What is your Nickname?</string>
  1. משתמשים בחלונית Attributes (מאפיינים) כדי להגדיר את המאפיינים הבאים בתצוגה EditText:

מאפיין

ערך

style

NameStyle

textAlignment

(מרכז)

hint

@string/what_is_your_nickname

  1. בחלונית מאפיינים, מסירים את הערך Name מהמאפיין text. ערך המאפיין text צריך להיות ריק כדי שהרמז יוצג.

שלב 2: הגדרת מאפיין inputType

המאפיין inputType מציין את סוג הקלט שהמשתמשים יכולים להזין בתצוגה EditText. מערכת Android מציגה את שדה הקלט המתאים ואת המקלדת הווירטואלית, בהתאם לסוג הקלט שהוגדר.

כדי לראות את כל סוגי הקלט האפשריים, בחלונית Attributes (מאפיינים), לוחצים על השדה inputType או על סמל שלוש הנקודות לצד השדה. תיפתח רשימה עם כל סוגי הקלט שאפשר להשתמש בהם, וסוג הקלט שפעיל כרגע יסומן. אפשר לבחור יותר מסוג קלט אחד.

לדוגמה, לסיסמאות משתמשים בערך textPassword. שדה הטקסט מסתיר את הקלט של המשתמש.

למספרי טלפון, משתמשים בערך phone. מוצגת מקלדת מספרים, והמשתמש יכול להזין רק מספרים.

מגדירים את סוג הקלט בשדה הכינוי:

  1. מגדירים את מאפיין inputType לערך textPersonName עבור nickname_edit עריכת הטקסט.
  2. בחלונית Component Tree (עץ הרכיבים), מוצגת אזהרה autoFillHints. האזהרה הזו לא רלוונטית לאפליקציה הזו, והיא לא קשורה ל-codelab הזה, לכן אפשר להתעלם ממנה. (מידע נוסף על מילוי אוטומטי זמין במאמר אופטימיזציה של האפליקציה למילוי אוטומטי).
  3. בחלונית מאפיינים , בודקים את הערכים של המאפיינים הבאים בתצוגה EditText:

מאפיין

ערך

id

nickname_edit

layout_width

match_parent (ברירת המחדל)

layout_height

wrap_content (ברירת המחדל)

style

@style/NameStyle

inputType

textPersonName

hint

"@string/what_is_your_nickname"

text

(ריק)

Button הוא רכיב בממשק המשתמש שהמשתמש יכול להקיש עליו כדי לבצע פעולה. לחצן יכול להכיל טקסט, סמל או גם טקסט וגם סמל.

במשימה הזו מוסיפים לחצן סיום, שהמשתמש מקיש עליו אחרי שהוא מזין כינוי. הלחצן מחליף את התצוגה EditText בתצוגה TextView שבה מוצג הכינוי. כדי לעדכן את הכינוי, המשתמש יכול להקיש על התצוגה TextView.

שלב 1: מוסיפים לחצן 'סיום'

  1. גוררים לחצן מהחלונית Palette אל Component Tree. ממקמים את הלחצן מתחת לnickname_edit edit text

  2. יוצרים משאב מחרוזת חדש בשם done. נותנים למחרוזת את הערך Done,
<string name="done">Done</string>
  1. משתמשים בחלונית Attributes (מאפיינים) כדי להגדיר את המאפיינים הבאים בתצוגה החדשה Button:

מאפיין

ערכים

id

done_button

text

@string/done

layout_gravity

center_horizontal

layout_width

wrap_content

המאפיין layout_gravity ממקם את התצוגה במרכז פריסת האב, LinearLayout.

  1. משנים את הסגנון ל-Widget.AppCompat.Button.Colored, שהוא אחד מהסגנונות המוגדרים מראש ש-Android מספקת. אפשר לבחור את הסגנון מהתפריט הנפתח או מהחלון משאבים.



    הסגנון הזה משנה את צבע הלחצן לצבע ההדגשה, colorAccent. צבע ההדגשה מוגדר בקובץ res/values/colors.xml.


קובץ colors.xml מכיל את צבעי ברירת המחדל של האפליקציה. אתם יכולים להוסיף משאבי צבע חדשים או לשנות את משאבי הצבע הקיימים בפרויקט, בהתאם לדרישות של האפליקציה.

קובץ colors.xml לדוגמה:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="colorPrimary">#008577</color>
   <color name="colorPrimaryDark">#00574B</color>
   <color name="colorAccent">#D81B60</color>
</resources>

שלב 2: עיצוב הלחצן 'סיום'

  1. בחלונית מאפיינים, מוסיפים מרווח עליון על ידי בחירה באפשרות Layout_Margin > Top. מגדירים את השוליים העליונים לערך layout_margin, שמוגדר בקובץ dimens.xml.


  2. בתפריט הנפתח, מגדירים את מאפיין fontFamily לערך roboto.


  3. עוברים לכרטיסייה טקסט ומאמתים את קוד ה-XML שנוצר עבור הלחצן החדש שנוסף.
<Button
   android:id="@+id/done_button"
   style="@style/Widget.AppCompat.Button.Colored"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_horizontal"
   android:layout_marginTop="@dimen/layout_margin"
   android:fontFamily="@font/roboto"
   android:text="@string/done" />

שלב 3: שינוי משאב הצבע

בשלב הזה, משנים את הצבע המשני של הלחצן כך שיתאים לסרגל האפליקציות של הפעילות.

  1. פותחים את res/values/colors.xml ומשנים את הערך של colorAccent ל-#76bf5e.
<color name="colorAccent">#76bf5e</color>

בסרגל הימני של עורך הקבצים אפשר לראות את הצבע שמתאים לקוד ה-HEX.

שימו לב לשינוי בצבע של הלחצן בכלי לעריכת עיצוב.

  1. מריצים את האפליקציה. מתחת לתיבת הטקסט לעריכה אמור להופיע לחצן DONE (סיום) עם סגנון.


אחרי שהמשתמש מזין כינוי ומקיש על הלחצן סיום, הכינוי מוצג בתצוגה TextView. במשימה הזו, מוסיפים תצוגת טקסט עם רקע צבעוני. בתצוגת הטקסט, הכינוי של המשתמש מוצג מעל star_image.

שלב 1: מוסיפים TextView לכינוי

  1. גוררים תצוגת טקסט מהחלונית Palette אל Component Tree. ממקמים את תצוגת הטקסט מתחת ל-done_button ומעל ל-star_image.


  2. משתמשים בחלונית Attributes (מאפיינים) כדי להגדיר את המאפיינים הבאים לתצוגה החדשה TextView:

מאפיין

ערך

id

nickname_text

style

NameStyle

textAlignment

(מרכז)

שלב 2: שינוי ההגדרה של הנראות של TextView

אפשר להציג או להסתיר תצוגות באפליקציה באמצעות המאפיין visibility. במאפיין הזה אפשר להזין אחד משלושת הערכים הבאים:

  • visible: התצוגה גלויה.
  • Invisible: התצוגה מוסתרת, אבל היא עדיין תופסת מקום בפריסה.
  • gone: התצוגה מוסתרת ולא תופסת מקום בפריסה.
  1. בחלונית Attributes, מגדירים את visibility של תצוגת הטקסט nickname_text ל-gone, כי לא רוצים שהאפליקציה תציג את תצוגת הטקסט הזו בהתחלה.



    שימו לב שכאשר משנים את המאפיין בחלונית Attributes, התצוגה nickname_text נעלמת מכלי העיצוב. התצוגה מוסתרת בתצוגה המקדימה של הפריסה.
  2. משנים את ערך המאפיין text של התצוגה המפורטת nickname_text למחרוזת ריקה.

קוד ה-XML שנוצר עבור TextView אמור להיראות כך:

<TextView
   android:id="@+id/nickname_text"
   style="@style/NameStyle"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textAlignment="center"
   android:visibility="gone"
   android:text="" />

תצוגה מקדימה של הפריסה אמורה להיראות כך:

פונקציית ה-handler של הקליקים באובייקט Button (או בכל תצוגה) מציינת את הפעולה שתתבצע כשמקישים על הלחצן (התצוגה). צריך להטמיע את הפונקציה שמטפלת באירוע הקליק ב-Activity שמארח את הפריסה עם הלחצן (תצוגה).

הפורמט של מאזין הקליקים הוא בדרך כלל כזה, כאשר התצוגה שהועברה היא התצוגה שקיבלה את הקליק או ההקשה.

private fun clickHandlerFunction(viewThatIsClicked: View) {
// Add code to perform the button click event
}

יש שתי דרכים לצרף את פונקציית click-listener לאירועי לחיצה על לחצן:

  • בפריסת ה-XML, אפשר להוסיף את המאפיין android:onClick לרכיב <Button>. לדוגמה:
<Button
   android:id="@+id/done_button"
   android:text="@string/done"
   ...
   android:onClick="clickHandlerFunction"/>

או

  • אפשר לעשות זאת באופן פרוגרמטי בזמן הריצה, ב-onCreate() של Activity, על ידי קריאה ל-setOnClickListener. לדוגמה:
myButton.setOnClickListener {
   clickHanderFunction(it)
}

במשימה הזו מוסיפים מאזין לקליקים ל-done_button באופן פרוגרמטי. מוסיפים את מאזין הקליקים בפעילות המתאימה, שהיא MainActivity.kt.

פונקציית ההאזנה לקליקים, שנקראת addNickname, תבצע את הפעולות הבאות:

  • מעתיקים את הטקסט מnickname_edit עריכת הטקסט.
  • מגדירים את הטקסט בתצוגת הטקסט nickname_text.
  • הסתרת תיבת עריכת הטקסט והלחצן.
  • הצגת הכינוי TextView.

שלב 1: מוסיפים click listener

  1. ב-Android Studio, בתיקייה java, פותחים את הקובץ MainActivity.kt.
  2. ב-MainActivity.kt, בתוך המחלקה MainActivity, מוסיפים פונקציה בשם addNickname. צריך לכלול פרמטר קלט בשם view מסוג View. הפרמטר view הוא View שעליו מופעלת הפונקציה. במקרה כזה, view יהיה מופע של לחצן DONE.
private fun addNickname(view: View) {
}
  1. בתוך הפונקציה addNickname, משתמשים ב-findViewById() כדי לקבל הפניה לטקסט העריכה nickname_edit ולתצוגת הטקסט nickname_text.
val editText = findViewById<EditText>(R.id.nickname_edit)
val nicknameTextView = findViewById<TextView>(R.id.nickname_text)
  1. מגדירים את הטקסט בתצוגת הטקסט nicknameTextView לטקסט שהמשתמש הזין ב-editText, ומקבלים אותו מהמאפיין text.
nicknameTextView.text = editText.text
  1. כדי להסתיר את התצוגה של הכינוי EditText, מגדירים את המאפיין visibility של editText לערך View.GONE.

במשימה הקודמת, שיניתם את הנכס visibility באמצעות עורך הפריסות. כאן מבצעים את אותה פעולה באופן פרוגרמטי.

editText.visibility = View.GONE
  1. כדי להסתיר את הלחצן סיום, מגדירים את המאפיין visibility לערך View.GONE. כבר יש לכם את ההפניה ללחצן כפרמטר הקלט של הפונקציה, view.
view.visibility = View.GONE
  1. בסוף הפונקציה addNickname, מגדירים את המאפיין visibility של התצוגה TextView לערך View.VISIBLE כדי שהיא תהיה גלויה.
nicknameTextView.visibility = View.VISIBLE

שלב 2: מצרפים את מאזין הקליקים ללחצן DONE

עכשיו יש לכם פונקציה שמגדירה את הפעולה שתתבצע כשמקישים על הלחצן DONE. צריך לצרף את הפונקציה לתצוגה Button.

  1. ב-MainActivity.kt, בסוף הפונקציה onCreate(), מקבלים הפניה לתצוגה סיום Button. משתמשים בפונקציה findViewById() וקוראים לפונקציה setOnClickListener. מעבירים הפניה לפונקציית click-listener, ‏ addNickname().
findViewById<Button>(R.id.done_button).setOnClickListener {
            addNickname(it)
        }

בדוגמת הקוד שלמעלה, it מתייחס ל-done_button, שהוא התצוגה שהועברה כארגומנט.

  1. מפעילים את האפליקציה, מזינים כינוי ומקישים על הלחצן סיום. שימו לב שטקסט העריכה והלחצן מוחלפים בתצוגת הטקסט של הכינוי.

שימו לב שגם אחרי שהמשתמש מקיש על הלחצן סיום, המקלדת עדיין גלויה. זוהי התנהגות ברירת המחדל.

שלב 3: הסתרת המקלדת

בשלב הזה מוסיפים קוד להסתרת המקלדת אחרי שהמשתמש מקיש על הלחצן סיום.

  1. ב-MainActivity.kt, בסוף הפונקציה addNickname(), מוסיפים את הקוד הבא. מידע נוסף על אופן הפעולה של הקוד הזה זמין במאמרי העזרה בנושא hideSoftInputFromWindow.
// Hide the keyboard.
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
  1. מריצים את האפליקציה שוב. שימו לב שאחרי שמקישים על סיום,המקלדת מוסתרת.

אחרי שהמשתמש מקיש על הלחצן סיום, אין לו אפשרות לשנות את הכינוי. במשימה הבאה, נהפוך את האפליקציה לאינטראקטיבית יותר ונוסיף פונקציונליות שתאפשר למשתמש לעדכן את הכינוי.

במשימה הזו, מוסיפים מאזין לקליקים לתצוגת הטקסט של הכינוי. ה-click listener מסתיר את תצוגת הטקסט של הכינוי, מציג את הטקסט לעריכה ומציג את הלחצן סיום.

שלב 1: מוסיפים click listener

  1. ב-MainActivity, מוסיפים פונקציה להאזנה לקליקים בשם updateNickname(view: View) לתצוגת הטקסט של הכינוי.
private fun updateNickname (view: View) {
}
  1. בתוך הפונקציה updateNickname, מקבלים הפניה לטקסט העריכה nickname_edit ולהפניה ללחצן סיום . כדי לעשות את זה, משתמשים בשיטה findViewById().
val editText = findViewById<EditText>(R.id.nickname_edit)
val doneButton = findViewById<Button>(R.id.done_button)
  1. בסוף הפונקציה updateNickname, מוסיפים קוד להצגת הטקסט לעריכה, להצגת הלחצן DONE ולהסתרת תצוגת הטקסט.
editText.visibility = View.VISIBLE
doneButton.visibility = View.VISIBLE
view.visibility = View.GONE
  1. ב-MainActivity.kt, בסוף הפונקציה onCreate(), קוראים ל-setOnClickListener בתצוגת הטקסט nickname_text. מעבירים הפניה לפונקציה click-listener, שהיא updateNickname().
findViewById<TextView>(R.id.nickname_text).setOnClickListener {
   updateNickname(it)
}
  1. מריצים את האפליקציה, מזינים כינוי, מקישים על הלחצן סיום ואז מקישים על התצוגה של הכינוי TextView. תצוגת הכינוי נעלמת, והטקסט לעריכה והלחצן סיום מופיעים.


שימו לב: כברירת מחדל, התצוגה EditText לא נמצאת במוקד והמקלדת לא גלויה. קשה למשתמש להבין שאפשר ללחוץ על תצוגת הטקסט של הכינוי. במשימה הבאה, תוסיפו מיקוד וסגנון לתצוגת הטקסט של הכינוי.

שלב 2: הגדרת המיקוד לתצוגת EditText והצגת המקלדת

  1. בסוף הפונקציה updateNickname, מגדירים את המיקוד לתצוגה EditText. משתמשים בשיטה requestFocus().
// Set the focus to the edit text.
editText.requestFocus()
  1. בסוף הפונקציה updateNickname, מוסיפים קוד כדי שהמקלדת תהיה גלויה.
// Show the keyboard.
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(editText, 0)

שלב 3: מוסיפים צבע רקע לתצוגת TextView של הכינוי

  1. מגדירים את צבע הרקע של תצוגת הטקסט nickname_text ל-@color/colorAccent ומוסיפים ריווח פנימי של @dimen/small_padding בתחתית. השינויים האלה ישמשו כרמז למשתמשים שאפשר ללחוץ על תצוגת הטקסט של הכינוי.
android:background="@color/colorAccent"
android:paddingBottom="@dimen/small_padding"
  1. מריצים את האפליקציה הסופית. המיקוד הוא בתיבת הטקסט לעריכה, הכינוי מוצג בתיבת הטקסט לעריכה והסגנון של תצוגת הטקסט של הכינוי מוגדר.

עכשיו אפשר להראות לחברים את אפליקציית AboutMe האינטראקטיבית.

פרויקט Android Studio: ‏ AboutMeInteractive

  • הכלי Layout Editor ב-Android Studio הוא כלי לעריכה של עיצובים חזותיים. אתם יכולים להשתמש בכלי לעריכת פריסות כדי ליצור את הפריסה של האפליקציה על ידי גרירת רכיבי ממשק משתמש לפריסה.
  • EditText הוא רכיב בממשק משתמש שמאפשר למשתמש להזין ולשנות טקסט.
  • Button הוא רכיב בממשק המשתמש שהמשתמש יכול להקיש עליו כדי לבצע פעולה. לחצן יכול להכיל טקסט, סמל או גם טקסט וגם סמל.

פונקציות מסוג Listener לקליקים

  • אפשר להוסיף מאזין קליקים לכל View כדי שהוא יגיב להקשה.
  • הפונקציה שמגדירה את מאזין הקליקים מקבלת את View שעליו לחצו.

אפשר לצרף פונקציה של מאזין לקליקים ל-View באחת משתי דרכים:

קורס ב-Udacity:

מסמכי תיעוד למפתחי Android:

בקטע הזה מפורטות אפשרויות למשימות ביתיות לתלמידים שעובדים על ה-Codelab הזה כחלק מקורס בהנחיית מדריך. המורה צריך:

  • אם צריך, מקצים שיעורי בית.
  • להסביר לתלמידים איך להגיש מטלות.
  • בודקים את שיעורי הבית.

אנשי ההוראה יכולים להשתמש בהצעות האלה כמה שרוצים, ומומלץ להם להקצות כל שיעורי בית אחרים שהם חושבים שמתאימים.

אם אתם עובדים על ה-codelab הזה לבד, אתם יכולים להשתמש במשימות האלה כדי לבדוק את הידע שלכם.

עונים על השאלות הבאות

שאלה 1

מהי המחלקה ש-EditText היא מחלקת משנה שלה?

  • View
  • LinearLayout
  • TextView
  • Button

שאלה 2

איזה מבין ערכי המאפיין visibility הבאים, אם הוא מוגדר בתצוגה, גורם לכך שהתצוגה מוסתרת ולא תופסת מקום בפריסה?

  • visible
  • Invisible
  • gone
  • hide

שאלה 3

ב-EditText, לא מומלץ לספק רמזים כי הם יוצרים עומס בשדה הקלט. נכון או לא נכון?

  • True
  • לא נכון

שאלה 4

איזו מההצהרות הבאות נכונה לגבי תצוגות Button?

  • Button תצוגה היא קבוצת תצוגות.
  • אפשר להציג רק שלוש תצוגות Button בכל מסך.
  • Button הצפיות ניתנות ללחיצה, ובלחיצה, מאזין הקליקים שמצורף מבצע פעולה.
  • Button הוא תוסף של ImageView.

עוברים לשיעור הבא: 2.3: Constraint layout using the Layout Editor

קישורים ל-codelabs אחרים בקורס הזה מופיעים בדף הנחיתה של ה-codelabs בנושא יסודות Android Kotlin.