‫Android Kotlin Fundamentals 02.2: إضافة تفاعلات المستخدمين

هذا الدرس التطبيقي حول الترميز هو جزء من دورة "أساسيات Android Kotlin". يمكنك تحقيق أقصى استفادة من هذه الدورة التدريبية إذا اتبعت ترتيب الخطوات في دروس البرمجة. يتم إدراج جميع الدروس التطبيقية حول الترميز الخاصة بالدورة التدريبية في الصفحة المقصودة للدروس التطبيقية حول الترميز في دورة Android Kotlin Fundamentals.

ما يجب معرفته

  • إنشاء تطبيق Android أساسي في Kotlin
  • تشغيل تطبيق Android على محاكي أو جهاز
  • إنشاء تخطيط خطي باستخدام "أداة تعديل التخطيط" في "استوديو Android"
  • إنشاء تطبيق بسيط يستخدم LinearLayout وTextView وScrollView وزرًا مع معالج نقرات

أهداف الدورة التعليمية

  • كيفية الحصول على إدخال المستخدم باستخدام طريقة عرض EditText
  • كيفية ضبط النص على طريقة عرض TextView باستخدام النص من طريقة العرض EditText
  • كيفية العمل مع View وViewGroup
  • كيفية تغيير مستوى رؤية View

الإجراءات التي ستنفذّها

  • أضِف تفاعلية إلى تطبيق AboutMe، وهو تطبيق من درس برمجة سابق.
  • أضِف EditText ليتمكّن المستخدم من إدخال نص.
  • أضِف Button ونفِّذ معالج النقر الخاص به.

في هذا الدرس التطبيقي حول الترميز، ستوسّع تطبيق AboutMe لإضافة تفاعل المستخدم. يمكنك إضافة حقل لقب وزر تم وعرض نص لعرض اللقب. بعد أن يُدخل المستخدم لقبًا وينقر على الزر تم، يتم تعديل عرض النص لإظهار اللقب الذي تم إدخاله. يمكن للمستخدم تعديل اللقب مرة أخرى من خلال النقر على عرض النص.

تطبيق AboutMe

في هذه المهمة، ستضيف حقل إدخال EditText للسماح للمستخدم بإدخال اسم مستعار.

الخطوة 1: تنفيذ الخطوات الأولى

  1. إذا لم يكن لديك تطبيق AboutMe من درس برمجة سابق، نزِّل الرمز الأوّلي AboutMeInteractive-Starter. هذا هو الرمز البرمجي نفسه الذي أكملته في تجربة عملية سابقة.
  2. افتح مشروع AboutMeInteractive-Starter في "استوديو Android".
  3. شغِّل التطبيق. سيظهر لك عرض نصي للاسم وصورة نجمة ومقطع طويل من النص في عرض قابل للتمرير.



    لاحظ أنّه لا يمكن للمستخدم تغيير أي من النصوص.

تكون التطبيقات أكثر إثارة للاهتمام إذا كان بإمكان المستخدم التفاعل معها، مثلاً إذا كان بإمكانه إدخال نص. لقبول إدخال النص، يوفّر نظام التشغيل Android أداة لواجهة المستخدم تُعرف باسم نص قابل للتعديل. يمكنك تحديد نص قابل للتعديل باستخدام EditText، وهو فئة فرعية من TextView. يتيح مربع تعديل النص للمستخدم إدخال وتعديل النص، كما هو موضّح في لقطة الشاشة أدناه.

الخطوة 2: إضافة عنصر EditText

  1. في "استوديو Android"، افتح ملف التنسيق activity_main.xml في علامة التبويب تصميم.
  2. في لوحة لوحة الألوان، انقر على نص.



    Ab TextView، وهو TextView، يظهر في أعلى قائمة عناصر النص في لوحة لوحة الألوان. أسفل Ab TextView، تظهر عدّة طرق عرض EditText.

    في جزء لوحة الألوان، لاحظ كيف يعرض رمز TextView الحرفين Ab بدون تسطير. ومع ذلك، تعرض رموز EditText Ab مع خط سفلي. يشير التسطير إلى أنّ العرض قابل للتعديل.

    بالنسبة إلى كل عرض من عروض EditText، يضبط نظام التشغيل Android سمات مختلفة، ويعرض النظام طريقة الإدخال المناسبة للبرامج (مثل لوحة المفاتيح على الشاشة).
  3. اسحب عنصر تحكّم PlainText إلى شجرة المكوّنات وضعه أسفل name_text وفوق star_image.


  4. استخدِم جزء السمات لضبط السمات التالية في طريقة العرض 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. استخدِم جزء السمات لضبط السمات التالية على طريقة العرض EditText:

السمة

القيمة

style

NameStyle

textAlignment

(الوسط)

hint

@string/what_is_your_nickname

  1. في جزء السمات، أزِل القيمة Name من السمة text. يجب أن تكون قيمة السمة text فارغة حتى يتم عرض التلميح.

الخطوة 2: ضبط السمة inputType

تحدّد السمة inputType نوع الإدخال الذي يمكن للمستخدمين إدخاله في طريقة العرض EditText. يعرض نظام Android حقل الإدخال ولوحة المفاتيح على الشاشة المناسبَين، وذلك حسب نوع الإدخال الذي تم ضبطه.

للاطّلاع على جميع أنواع الإدخال الممكنة، انقر على الحقل inputType في لوحة السمات، أو انقر على علامات الحذف الثلاث ... بجانب الحقل. تفتح قائمة تعرض جميع أنواع الإدخال التي يمكنك استخدامها، مع وضع علامة في المربّع بجانب نوع الإدخال النشط حاليًا. يمكنك اختيار أكثر من نوع إدخال واحد.

على سبيل المثال، بالنسبة إلى كلمات المرور، استخدِم القيمة textPassword. يخفي حقل النص إدخال المستخدم.

بالنسبة إلى أرقام الهواتف، استخدِم القيمة phone. يتم عرض لوحة مفاتيح رقمية، ولا يمكن للمستخدم إدخال سوى الأرقام.

اضبط نوع الإدخال لحقل اللقب:

  1. اضبط السمة inputType على textPersonName من أجل nickname_edit النص القابل للتعديل.
  2. في لوحة شجرة المكوّنات، ستلاحظ تحذيرًا autoFillHints. لا ينطبق هذا التحذير على هذا التطبيق وهو خارج نطاق هذا الدرس البرمجي، لذا يمكنك تجاهله. (لمزيد من المعلومات حول ميزة "الملء التلقائي"، اطّلِع على مقالة تحسين تطبيقك لاستخدام ميزة "الملء التلقائي").
  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. اسحب زرًا من جزء لوحة الألوان إلى شجرة المكوّنات. ضَع الزر أسفل nickname_edit نص التعديل

    .
  2. أنشئ مورد سلسلة جديدًا باسم done. امنح السلسلة القيمة Done،
<string name="done">Done</string>
  1. استخدِم جزء السمات لضبط السمات التالية في طريقة العرض 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>

يمكنك الاطّلاع على اللون المتوافق مع الرمز السداسي العشري في الهامش الأيمن لمحرّر الملف.

لاحظ التغيير في لون الزر في "محرّر التصميم".

  1. شغِّل تطبيقك. من المفترض أن يظهر زر تم منمّق أسفل النص القابل للتعديل.


بعد أن يُدخل المستخدم لقبًا وينقر على الزر تم، يظهر اللقب في طريقة عرض TextView. في هذه المهمة، ستضيف طريقة عرض نصية بخلفية ملونة. تعرض طريقة عرض النص لقب المستخدم فوق star_image.

الخطوة 1: إضافة TextView للاسم المستعار

  1. اسحب عرضًا نصيًا من لوحة الأدوات إلى شجرة المكوّنات. ضَع عرض النص أسفل done_button وفوق star_image.


  2. استخدِم جزء السمات لضبط السمات التالية لعرض TextView الجديد:

السمة

القيمة

id

nickname_text

style

NameStyle

textAlignment

(الوسط)

الخطوة 2: تغيير مستوى رؤية TextView

يمكنك إظهار طرق العرض أو إخفاؤها في تطبيقك باستخدام السمة visibility. تتضمّن هذه السمة إحدى القيم الثلاث التالية:

  • visible: العرض مرئي.
  • Invisible: يؤدي إلى إخفاء طريقة العرض، ولكنها تظل تشغل مساحة في التصميم.
  • gone: يخفي طريقة العرض، ولا تشغل طريقة العرض أي مساحة في التصميم.
  1. في لوحة السمات، اضبط قيمة visibility لعرض النص nickname_text على gone، لأنّك لا تريد أن يعرض تطبيقك طريقة عرض النص هذه في البداية.



    لاحظ أنّه عند تغيير السمة في لوحة السمات، يختفي العرض 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="" />

يجب أن تبدو معاينة التنسيق على النحو التالي:

يحدّد معالج النقرات في العنصر Button (أو في أي عرض) الإجراء الذي سيتم تنفيذه عند النقر على الزر (العرض). يجب تنفيذ الدالة التي تعالج حدث النقر في Activity الذي يستضيف التصميم الذي يتضمّن الزر (طريقة العرض).

يتضمّن برنامج معالجة النقرات عادةً هذا التنسيق، حيث يكون العرض الذي تم تمريره هو العرض الذي تلقّى النقرة أو اللمسة.

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

يمكنك ربط وظيفة معالجة النقرات بأحداث النقر على الأزرار بطريقتَين:

  • في تنسيق 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: إضافة أداة معالجة نقرات

  1. في Android Studio، افتح الملف MainActivity.kt في المجلد java.
  2. في MainActivity.kt، داخل الفئة MainActivity، أضِف دالة باسم addNickname. أدرِج مَعلمة إدخال باسم view من النوع View. المَعلمة view هي View التي يتم استدعاء الدالة عليها. في هذه الحالة، سيكون view مثيلاً لزر تم.
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، اجعل طريقة عرض الاسم المستعار TextView مرئية من خلال ضبط السمة visibility على View.VISIBLE.
nicknameTextView.visibility = View.VISIBLE

الخطوة 2: إرفاق أداة معالجة النقرات بزر "تم"

بعد أن أصبحت لديك دالة تحدّد الإجراء الذي سيتم تنفيذه عند النقر على الزر تم، عليك ربط الدالة بطريقة العرض Button.

  1. في MainActivity.kt، في نهاية الدالة onCreate()، احصل على مرجع للعرض تم Button. استخدِم الدالة findViewById() واتّصِل بـ setOnClickListener. مرِّر مرجعًا إلى دالة معالج النقرات، 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. شغِّل تطبيقك مرة أخرى. يُرجى العِلم أنّه بعد النقر على تم، سيتم إخفاء لوحة المفاتيح.

لا يمكن للمستخدم تغيير الاسم المستعار بعد النقر على الزر تم. في المهمة التالية، ستجعل التطبيق أكثر تفاعلية وتضيف وظيفة تتيح للمستخدم تعديل الاسم المستعار.

في هذه المهمة، ستضيف أداة معالجة نقرات إلى عرض نص اللقب. يخفي برنامج معالجة النقرات عرض نص الاسم المستعار، ويعرض نص التعديل، ويعرض الزر تم.

الخطوة 1: إضافة أداة معالجة نقرات

  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، أضِف رمزًا برمجيًا لعرض النص القابل للتعديل وزر تم وإخفاء عرض النص.
editText.visibility = View.VISIBLE
doneButton.visibility = View.VISIBLE
view.visibility = View.GONE
  1. في MainActivity.kt، في نهاية الدالة onCreate()، استدعِ setOnClickListener في عرض النص nickname_text. مرِّر مرجعًا إلى دالة معالج النقرات، وهي 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": AboutMeInteractive

  • أداة "محرّر التصميم" في "استوديو Android" هي أداة تعديل مرئية للتصميم. يمكنك استخدام "أداة تعديل التصميم" لإنشاء تصميم تطبيقك عن طريق سحب عناصر واجهة المستخدم إلى التصميم.
  • EditText هو أحد عناصر واجهة المستخدم الذي يتيح للمستخدم إدخال النص وتعديله.
  • Button هو عنصر في واجهة المستخدم يمكن للمستخدم النقر عليه لتنفيذ إجراء. يمكن أن يتألف الزر من نص أو رمز أو كليهما.

أدوات معالجة أحداث النقر

  • يمكنك جعل أي View يستجيب للنقر عليه من خلال إضافة أداة معالجة النقر إليه.
  • تتلقّى الدالة التي تحدّد أداة معالجة أحداث النقر العنصر View الذي تم النقر عليه.

يمكنك ربط دالة معالجة نقرات بعنصر View بإحدى الطريقتَين التاليتَين:

دورة Udacity التدريبية:

مستندات مطوّري تطبيقات Android:

يسرد هذا القسم مهامًا منزلية محتملة للطلاب الذين يعملون على هذا الدرس التطبيقي العملي كجزء من دورة تدريبية يقودها مدرّب. على المعلّم تنفيذ ما يلي:

  • حدِّد واجبًا منزليًا إذا لزم الأمر.
  • توضيح كيفية إرسال الواجبات المنزلية للطلاب
  • وضع درجات للواجبات المنزلية

يمكن للمدرّبين استخدام هذه الاقتراحات بالقدر الذي يريدونه، ويجب ألا يترددوا في تكليف الطلاب بأي واجبات منزلية أخرى يرونها مناسبة.

إذا كنت تعمل على هذا الدرس العملي بنفسك، يمكنك استخدام مهام الواجب المنزلي هذه لاختبار معلوماتك.

الإجابة عن هذه الأسئلة

السؤال 1

ما هو EditText الذي يندرج ضمن فئة فرعية منه؟

  • View
  • LinearLayout
  • TextView
  • Button

السؤال 2

أيّ من قيم السمة visibility التالية، إذا تم ضبطها على طريقة عرض، تجعل طريقة العرض مخفية ولا تشغل أي مساحة في التصميم؟

  • visible
  • Invisible
  • gone
  • hide

السؤال 3

بالنسبة إلى طرق العرض EditText، لا يُنصح بتقديم تلميحات لأنّها تؤدي إلى تشويش حقل الإدخال. صواب أم خطأ؟

  • True
  • خطأ

السؤال 4

أيّ من العبارات التالية صحيحة بشأن المشاهدات على Button؟

  • Button طريقة العرض هي مجموعة من طرق العرض.
  • يمكنك عرض ثلاث صور Button فقط لكل شاشة.
  • يمكن النقر على طرق العرض Button، وعند النقر، ينفّذ مستمع النقرات المرفق إجراءً.
  • Button هي إضافة لـ ImageView.

ابدأ الدرس التالي: 2.3: تخطيط مقيّد باستخدام "أداة تعديل التنسيق"

للحصول على روابط تؤدي إلى دروس تطبيقية أخرى في هذه الدورة التدريبية، اطّلِع على الصفحة المقصودة الخاصة بالدروس التطبيقية حول أساسيات Android Kotlin.