هذا الدرس التطبيقي حول الترميز هو جزء من دورة "أساسيات Android Kotlin". يمكنك تحقيق أقصى استفادة من هذه الدورة التدريبية إذا اتبعت ترتيب الخطوات في دروس البرمجة. يتم إدراج جميع الدروس التطبيقية حول الترميز الخاصة بالدورة التدريبية في الصفحة المقصودة للدروس التطبيقية حول الترميز في دورة Android Kotlin Fundamentals.
مقدمة
لقد أعددت كل شيء حتى الآن، وأنشأ Android Studio الكثير من الرموز البرمجية لك. قبل تعديل كل هذا الرمز، من المهم معرفة ما أنشأته للتو وكيفية التنقّل في ملفات المصدر لتطبيق Android.
في هذا الدرس العملي، ستتعرّف على المكوّنات الرئيسية لتطبيق Android وتضيف تفاعلاً بسيطًا إلى تطبيق باستخدام زر.
ما يجب معرفته
- كيفية تثبيت "استوديو Android" وفتحه
- كيفية إنشاء مشروع تطبيق جديد
- كيفية تشغيل تطبيق على محاكي أو جهاز فعلي
ما ستتعرّف عليه
- كيفية تعديل ملف تنسيق التطبيق
- كيفية إنشاء تطبيق يتضمّن سلوكًا تفاعليًا
- الكثير من المصطلحات الجديدة اطّلِع على مسرد المفردات للحصول على شرح بسيط للمصطلحات والمفاهيم.
الإجراءات التي ستتّخذها
- استكشِف ملف
MainActivity
Kotlin وملف تنسيق النشاط. - عدِّل تخطيط النشاط في XML.
- أضِف عنصر
Button
إلى تصميم النشاط. - استخرِج السلاسل البرمجية المضمّنة في التعليمات البرمجية إلى ملف موارد السلاسل.
- نفِّذ طرق معالجة النقرات لعرض الرسائل على الشاشة عندما ينقر المستخدم على
Button
.
في هذا الدرس العملي، ستنشئ مشروع تطبيق جديدًا باسم DiceRoller وتضيف تفاعلاً أساسيًا باستخدام زر. في كل مرة يتم فيها النقر على الزر، تتغير قيمة النص المعروض. يبدو تطبيق DiceRoller النهائي لهذا الدرس التطبيقي حول الترميز على النحو التالي:
في الدرس العملي السابق، تعرّفت على الأجزاء الرئيسية من مشروع تطبيق، بما في ذلك الدليلان java
وres
. في هذه المهمة، ستركز على أهم ملفَين يشكّلان تطبيقك، وهما ملف MainActivity
Kotlin وملف activity_main.xml
التصميم.
الخطوة 1: فحص MainActivity
MainActivity
هو مثال على Activity
. Activity
هي فئة أساسية في Android ترسم واجهة مستخدم (UI) لتطبيق Android وتتلقّى أحداث الإدخال. عند تشغيل تطبيقك، يتم تشغيل النشاط المحدّد في الملف AndroidManifest.xml
.
تحدّد العديد من لغات البرمجة طريقة رئيسية لبدء البرنامج. لا تحتوي تطبيقات Android على طريقة رئيسية. بدلاً من ذلك، يشير ملف AndroidManifest.xml
إلى أنّه يجب تشغيل MainActivity
عندما ينقر المستخدم على رمز مشغّل التطبيق. لبدء نشاط، يستخدم نظام التشغيل Android المعلومات الواردة في ملف البيان لإعداد بيئة التطبيق وإنشاء MainActivity
. بعد ذلك، يقوم MainActivity
بإجراء بعض عمليات الإعداد.
يحتوي كل نشاط على ملف تصميم مرتبط به. يتم ربط النشاط والتصميم من خلال عملية تُعرف باسم تضخيم التصميم. عند بدء النشاط، يتم تحويل طرق العرض المحدّدة في ملفات تنسيق XML إلى عناصر عرض Kotlin (أو "تضخيمها") في الذاكرة. وبعد حدوث ذلك، يمكن للنشاط رسم هذه العناصر على الشاشة وتعديلها ديناميكيًا أيضًا.
- في "استوديو Android"، انقر على ملف > جديد > مشروع جديد لإنشاء مشروع جديد. استخدِم "نشاط فارغ" وانقر على التالي.
- أطلِق على المشروع اسم DiceRoller، وتأكَّد من صحة جميع القيم الأخرى الخاصة باسم المشروع وموقعه. تأكَّد من وضع علامة في المربّع "استخدام عناصر AndroidX". انقر على إنهاء.
- في لوحة المشروع > Android، وسِّع java > com.example.android.diceroller. انقر مرّتين على MainActivity. تعرض أداة تعديل الرموز الرمز في
MainActivity
. - يظهر أسفل اسم الحزمة وعبارات الاستيراد تعريف الفئة
MainActivity
. تمتد الفئةMainActivity
إلىAppCompatActivity
.
class MainActivity : AppCompatActivity() { ...
- لاحظ طريقة
onCreate()
. لا تستخدم الأنشطة دالة إنشائية لتهيئة العنصر. بدلاً من ذلك، يتم استدعاء سلسلة من الطرق المحدّدة مسبقًا (تُعرف باسم "طُرق مراحل النشاط") كجزء من عملية إعداد النشاط. إحدى طرق مراحل النشاط هذه هيonCreate()
، والتي يتم دائمًا إلغاء تعريفها في تطبيقك. يمكنك التعرّف على المزيد من المعلومات عن طرق مراحل النشاط في درس برمجة لاحق.
فيonCreate()
، يمكنك تحديد التصميم المرتبط بالنشاط، ثم توسيع التصميم. تنفّذ الطريقةsetContentView()
كلا الإجراءين.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
يشير الأسلوب setContentView()
إلى التنسيق باستخدام R.layout.activity_main
، وهو في الواقع مرجع عدد صحيح. يتم إنشاء الفئة R
عند إنشاء تطبيقك. وتتضمّن الفئة R
جميع مواد عرض التطبيق، بما في ذلك محتويات الدليل res
.
في هذه الحالة، يشير R.layout.activity_main
إلى فئة R
التي تم إنشاؤها والمجلد layout
وملف التصميم activity_main.xml
. (لا تتضمّن المراجع امتدادات الملفات). ستشير إلى العديد من موارد التطبيق (بما في ذلك الصور والسلاسل والعناصر داخل ملف التصميم) باستخدام مراجع مشابهة في الفئة R
.
الخطوة 2: فحص ملف تصميم التطبيق واستكشافه
تحتوي جميع الأنشطة في تطبيقك على ملف تصميم مرتبط بها في الدليل res/layout
للتطبيق. ملف التنسيق هو ملف XML يعبّر عن الشكل الفعلي للنشاط. ويتم ذلك من خلال تحديد طرق العرض وتحديد أماكن ظهورها على الشاشة.
طرق العرض هي عناصر مثل النصوص والصور والأزرار التي توسّع فئة View
. تتوفّر أنواع عديدة من طرق العرض، بما في ذلك TextView
وButton
وImageView
وCheckBox
.
في هذه المهمة، ستفحص ملف تخطيط التطبيق وتعدّله.
- في لوحة المشروع > Android، وسِّع res > layout وانقر نقرًا مزدوجًا على activity_main.xml. يتم فتح أداة تعديل تصميم التنسيق. يتضمّن Android Studio هذا المحرّر الذي يتيح لك إنشاء تصميم تطبيقك بطريقة مرئية ومعاينة تصميم التخطيط. يمكنك التعرّف على المزيد حول "محرّر التصميم" في درس برمجة لاحق.
- لعرض ملف التصميم بتنسيق XML، انقر على علامة التبويب نص في أسفل النافذة.
- احذف كل رموز XML الحالية في "محرّر التصميم". يُعدّ التصميم التلقائي الذي تحصل عليه مع مشروع جديد نقطة بداية جيدة إذا كنت تعمل باستخدام أداة تعديل التصميم في "استوديو Android". في هذا الدرس، ستعمل على ملف XML الأساسي لإنشاء تخطيط جديد من البداية.
- انسخ هذا الرمز والصقه في التنسيق:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
الآن، افحص الرمز البرمجي:
- العنصر ذو المستوى الأعلى أو العنصر الجذر للتصميم هو عنصر
<LinearLayout>
. العرضLinearLayout
هوViewGroup
. عناصر عرض المجموعات هي حاويات تتضمّن عناصر عرض أخرى وتساعد في تحديد مواضع عناصر العرض على الشاشة.
يتم تنظيم جميع طرق العرض ومجموعات طرق العرض التي تضيفها إلى التصميم في تسلسل هرمي لطرق العرض، ويكون عنصر XML الأعلى هو جذر هذا التسلسل الهرمي. يمكن أن يحتوي العرض الأساسي على عروض ومجموعات عروض أخرى، ويمكن أن تحتوي مجموعات العروض على عروض ومجموعات عروض أخرى. عندما يشغّل تطبيقك تسلسل عرض العناصر، يتحوّل تسلسل عرض العناصر في ملف تخطيط XML إلى تسلسل هرمي للكائنات عند توسيع التخطيط. في هذه الحالة، تكون مجموعة العرض الجذرية عبارة عن تخطيط خطي، ما يؤدي إلى تنظيم طرق العرض الثانوية خطيًا، أي واحدة تلو الأخرى (إما عموديًا أو أفقيًا).
إنّ الجذر التلقائي الذي تحصل عليه لمشروع Android جديد هوConstraintLayout
، وهو يعمل بشكل جيد بالتنسيق مع أداة تعديل التصميم. بالنسبة إلى هذا التطبيق، يمكنك استخدام مجموعة عرضLinearLayout
، وهي أبسط من تخطيط القيود. ستتعرّف على المزيد من المعلومات حول مجموعات العرض وتصميم القيود في الدرس التالي. - داخل العلامة
LinearLayout
، لاحظ السمةandroid:layout_width
. تم ضبط عرضLinearLayout
علىmatch parent
، ما يجعله بالعرض نفسه الذي يظهر به العنصر الرئيسي. بما أنّ هذا هو العرض الأساسي، يتوسّع التصميم ليملأ عرض الشاشة بالكامل. - لاحظ السمة
android:layout_height
التي تم ضبطها علىwrap_content
. تجعل هذه السمة ارتفاعLinearLayout
مطابقًا للارتفاع المجمّع لجميع طرق العرض التي يحتوي عليها، والتي لا تتضمّن حاليًا سوىTextView
. - افحص عنصر
<TextView>
. هذا العنصرTextView
، الذي يعرض النص، هو العنصر المرئي الوحيد في تطبيق DiceRoller. تحتوي السمةandroid:text
على السلسلة الفعلية المطلوب عرضها، وهي في هذه الحالة السلسلة"Hello World!"
- لاحظ السمتَين
android:layout_width
وandroid:layout_height
في العنصر<TextView>
، وكلتاهما مضبوطتان علىwrap_content
. محتوى عرض النص هو النص نفسه، لذا لن يشغل العرض سوى المساحة المطلوبة للنص.
لن يكون تطبيق رمي النرد مفيدًا جدًا بدون طريقة تتيح للمستخدم رمي النرد ومعرفة النتيجة. للبدء، أضِف زرًا إلى التصميم لرمي النرد، وأضِف نصًا يعرض قيمة النرد التي حصل عليها المستخدم.
الخطوة 1: إضافة زر إلى التصميم
- أضِف عنصر
Button
إلى التنسيق أسفل عرض النص عن طريق إدخال <Button ثم اضغط على Return. يظهر المربعButton
الذي ينتهي بـ/>
ويتضمّن السمتَينlayout_width
وlayout_height
.
<Button
android:layout_width=""
android:layout_height="" />
- اضبط السمتَين
layout_width
وlayout_height
على"wrap_content"
. باستخدام هذه القيم، يكون الزر بنفس عرض وارتفاع تصنيف النص الذي يحتويه. - أضِف السمة
android:text
إلى الزر، وأدخِل القيمة "Roll". يظهر عنصر الزر الآن على النحو التالي:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Roll" />
بالنسبة إلى طرق العرض Button
، تكون السمة text
هي تصنيف الزر. في "محرِّر التصميم"، يتم تمييز السمة باللون الأصفر، ما يشير إلى تلميح أو تحذير. في هذه الحالة، يظهر التمييز باللون الأصفر لأنّ السلسلة "Roll"
مبرمَجة بشكل ثابت في تصنيف الزر، ولكن يجب أن تكون السلسلة مصدرًا. ستتعرّف على موارد السلاسل في القسم التالي.
الخطوة 2: استخراج موارد السلاسل
بدلاً من الترميز الثابت للسلاسل في ملفات التنسيق أو الرموز البرمجية، من أفضل الممارسات وضع جميع سلاسل تطبيقك في ملف منفصل. اسم هذا الملف هو strings.xml
، ويقع ضمن موارد التطبيق في الدليل res/values/
.
يؤدي وضع السلاسل في ملف منفصل إلى تسهيل إدارتها، خاصةً إذا كنت تستخدم هذه السلاسل أكثر من مرة. بالإضافة إلى ذلك، تُعدّ موارد السلسلة إلزامية لترجمة تطبيقك وأقلمته، لأنّ عليك إنشاء ملف موارد سلسلة لكل لغة.
يساعدك "استوديو Android" في تذكُّر وضع السلاسل في ملف موارد من خلال تزويدك بتلميحات وتحذيرات.
- انقر مرة واحدة على السلسلة "Roll" في السمة
android:text
الخاصة بالعلامة<Button>
. - اضغط على
Alt+Enter
(Option+Enter
في نظام التشغيل macOS) واختَر استخراج مورد السلسلة من القائمة المنبثقة. - أدخِل
roll_label
في حقل اسم المورد. - انقر على موافق. يتم إنشاء مورد سلسلة في الملف
res/values/string.xml
، ويتم استبدال السلسلة في عنصر الزر بإشارة إلى هذا المورد:android:text="@string/roll_label"
- في لوحة المشروع > Android، وسِّع res > القيم، ثم انقر مرّتين على strings.xml لعرض موارد السلسلة في الملف
strings.xml
:
<resources>
<string name="app_name">DiceRoller</string>
<string name="roll_label">Roll</string>
</resources>
الخطوة 3: تصميم طرق العرض وتحديد موضعها
يحتوي التنسيق الآن على طريقة عرض TextView
واحدة وطريقة عرض Button
واحدة. في هذه المهمة، عليك ترتيب طرق العرض ضمن مجموعة طرق العرض لتصبح أكثر جاذبية.
- انقر على علامة التبويب تصميم للاطّلاع على معاينة للتصميم. في الوقت الحالي، يظهر كلا العرضَين بجانب بعضهما البعض ويتم نقلهما إلى أعلى الشاشة.
- انقر على علامة التبويب نص للرجوع إلى محرّر XML. أضِف السمة
android:orientation
إلى العلامةLinearLayout
، وأعطِها القيمة"vertical"
. من المفترض أن يبدو العنصر<LinearLayout>
الآن على النحو التالي:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
تحدّد مجموعة العرض LinearLayout
مواضع طرق العرض التي تحتويها واحدة تلو الأخرى في سطر، إما أفقيًا في صف أو عموديًا في حزمة. يكون التنسيق الأفقي هو التنسيق التلقائي. بما أنّك تريد وضع TextView
فوق Button
، عليك ضبط الاتجاه على عمودي. أصبح التصميم الآن على النحو التالي، مع ظهور الزر أسفل النص:
- أضِف السمة
android:layout_gravity
إلى كل منTextView
وButton
، وأعطِها القيمة"center_horizontal"
. يؤدي ذلك إلى محاذاة كلتا طريقتَي العرض على طول مركز المحور الأفقي. يجب أن يبدو العنصران TextView وButton الآن على النحو التالي:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Hello World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
- أضِف السمة
android:layout_gravity
إلى التصميم الخطي، وأعطِها القيمة"center_vertical"
. يجب أن يبدو العنصرLinearLayout
الآن على النحو التالي:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
tools:context=".MainActivity">
- لزيادة حجم النص في عرض النص، أضِف السمة
android:textSize
إلى العنصر<TextView>
بالقيمة"30sp"
. يشير الاختصار sp إلى وحدات البكسل القابلة للتوسّع، وهي مقياس لتحديد حجم النص بشكل مستقل عن جودة شاشة الجهاز. من المفترض أن يبدو عنصر TextView الآن على النحو التالي:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="30sp"
android:text="Hello World!" />
- جمِّع تطبيقك وشغِّله.
الآن، تم وضع كلّ من النص والزر بشكلٍ مناسب، ويظهر نص أكبر في عرض النص. لا يتضمّن الزر أي وظائف حتى الآن، لذا لن يحدث أي شيء عند النقر عليه. يمكنك العمل على ذلك لاحقًا.
الخطوة 4: الحصول على مرجع للزر في الرمز
رمز Kotlin في MainActivity
مسؤول عن تحديد الأجزاء التفاعلية في تطبيقك، مثل ما يحدث عند النقر على زر. لكتابة دالة يتم تنفيذها عند النقر على الزر، عليك الحصول على مرجع إلى عنصر الزر في التنسيق الذي تم تضخيمه في MainActivity. للحصول على مرجع للزر:
- امنح
Button
رقم تعريف في ملف XML. - استخدِم طريقة
findViewById()
في الرمز البرمجي للحصول على مرجع إلىView
بمعرّف معيّن.
بعد الحصول على مرجع إلى طريقة العرض Button
، يمكنك استدعاء طرق العرض هذه لتغييرها ديناميكيًا أثناء تشغيل التطبيق. على سبيل المثال، يمكنك إضافة معالج نقرات ينفّذ الرمز البرمجي عند النقر على الزر.
- افتح ملف تنسيق
activity_main.xml
، إذا لم يكن مفتوحًا من قبل، وانقر على علامة التبويب نص. - أضِف السمة
android:id
إلى الزرّ، وأعطِها اسمًا (في هذه الحالة،@+id/roll_button"
). سيصبح العنصر<Button>
الآن على النحو التالي:
<Button
android:id="@+id/roll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
عند إنشاء معرّف لعنصر عرض في ملف تنسيق XML، ينشئ Android Studio ثابتًا صحيحًا باسم هذا المعرّف في الفئة R
التي تم إنشاؤها. لذا، إذا سمّيت طريقة عرض roll_button
، ينشئ Android Studio ثابتًا صحيحًا باسم roll_button
في الفئة R
. تخبر البادئة "@+id"
لاسم المعرّف المترجم البرمجي بإضافة ثابت المعرّف هذا إلى الفئة R. يجب أن تتضمّن جميع معرّفات طرق العرض في ملف XML هذه البادئة.
- افتح
MainActivity
ملف Kotlin. داخلonCreate()
، بعدsetContentView()
، أضِف السطر التالي:
val rollButton: Button = findViewById(R.id.roll_button)
استخدِم طريقة findViewById()
للحصول على مرجع View
للعرض الذي حدّدته في فئة XML. في هذه الحالة، يمكنك الحصول على المرجع Button
من الفئة R
والمعرّف roll_button
، ثم تعيين هذا المرجع إلى المتغيّر rollButton
.
- لاحظ أنّ Android Studio يميّز الفئة
Button
باللون الأحمر ويضع تحتها خطًا للإشارة إلى أنّها مرجع لم يتم حله وأنّه عليك استيراد هذه الفئة قبل أن تتمكّن من استخدامها. قد يظهر أيضًا تلميح أدوات يشير إلى اسم الفئة المؤهَّل بالكامل: - اضغط على
Alt+Enter
(Option+Enter
على جهاز Mac) لقبول اسم الفئة المؤهَّل بالكامل.
الخطوة 5: إضافة معالج نقرات لعرض إشعار مؤقت
معالج النقرات هو طريقة يتم استدعاؤها في كل مرة ينقر فيها المستخدم على عنصر واجهة مستخدم قابل للنقر، مثل زر. لإنشاء معالج نقرات، يجب توفُّر ما يلي:
- طريقة تنفّذ بعض العمليات
- طريقة
setOnClickHandler()
، التي تربطButton
بطريقة المعالجة
في هذه المهمة، ستنشئ طريقة معالجة النقرات لعرض Toast
. (الإشعار المنبثق هو رسالة تظهر على الشاشة لفترة قصيرة). عليك ربط طريقة معالجة النقرات بـ Button
.
- في فئة
MainActivity
بعدonCreate()
، أنشئ دالة خاصة باسمrollDice()
.
private fun rollDice() {
}
- أضِف هذا السطر إلى طريقة
rollDice()
لعرضToast
عند استدعاءrollDice()
:
Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
لإنشاء إشعار مؤقت، استدعِ طريقة Toast.makeText()
. تتطلّب هذه الطريقة ثلاثة أمور:
- كائن
Context
يتيح لك العنصرContext
التواصل مع نظام التشغيل Android والحصول على معلومات حول حالته الحالية. أنت بحاجة إلىContext
هنا حتى يتمكّن العنصرToast
من إخبار نظام التشغيل بعرض الإشعار المؤقت. بما أنّAppCompatActivity
هي فئة فرعية منContext
، يمكنك استخدام الكلمة الرئيسيةthis
للسياق. - الرسالة التي سيتم عرضها، هنا
"button clicked"
- مدة عرض الرسالة تعرض الطريقة
show()
في النهاية الإشعار المؤقت.
- في
onCreate()
، بعد طلبfindViewById()
، أضِف هذا السطر لتعيينrollDice()
كمعالج نقرات للعنصرrollButton
:
rollButton.setOnClickListener { rollDice() }
يبدو التعريف الكامل للفئة MainActivity
الآن على النحو التالي:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener { rollDice() }
}
private fun rollDice() {
Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
}
}
- يمكنك تجميع تطبيقك وتشغيله. وفي كل مرة تنقر فيها على الزر، من المفترض أن يظهر إشعار مؤقت.
في هذه المهمة، يمكنك تعديل طريقة rollDice()
لتغيير النص في TextView
. في الخطوة الأولى، يمكنك تغيير هذا النص من "Hello World!"
إلى السلسلة "Dice Rolled!"
. في الخطوة الثانية، اعرض رقمًا عشوائيًا بين 1 و6.
الخطوة 1: عرض سلسلة
- افتح
activity_main.xml
وأضِف رقم تعريف إلىTextView
.
android:id="@+id/result_text"
- فتح "
MainActivity
" في الطريقةrollDice()
، علِّق على السطر لعرضToast
. - استخدِم طريقة
findViewById()
للحصول على مرجع إلىTextView
من خلال معرّفه. عيِّن المرجع إلى متغيّرresultText
.
val resultText: TextView = findViewById(R.id.result_text)
- عيِّن سلسلة جديدة للسمة
resultText.text
لتغيير النص المعروض. يمكنك تجاهل التلميح لاستخراج السلسلة إلى مورد، فهذه مجرد سلسلة مؤقتة.
resultText.text = "Dice Rolled!"
- جمِّع التطبيق وشغِّله. لاحظ أنّ النقر على الزر التجربة يؤدي الآن إلى تعديل
TextView
.
الخطوة 2: عرض رقم عشوائي
أخيرًا، في هذه المهمة، ستضيف عشوائية إلى النقر على الزر لمحاكاة رمي النرد. في كل مرة يتم فيها النقر على الزر أو الضغط عليه، يختار الرمز رقمًا عشوائيًا من 1 إلى 6 ويعدّل TextView
. إنّ مهمة إنشاء رقم عشوائي ليست خاصة بنظام التشغيل Android، ويمكنك استخدام الفئة Random
لتنفيذها.
- في أعلى طريقة
rollDice()
، استخدِم طريقةRandom.nextInt()
للحصول على رقم عشوائي بين 1 و6:
val randomInt = Random().nextInt(6) + 1
- اضبط السمة
text
على قيمة العدد الصحيح العشوائي، كسلسلة:
resultText.text = randomInt.toString()
- جمِّع التطبيق وشغِّله. في كل مرة تنقر فيها على الزر رمي النرد، يتغيّر الرقم في طريقة عرض النص.
مشروع "استوديو Android": DiceRoller
التحدي: أضِف زرًا ثانيًا إلى التطبيق يحمل التصنيف "العدّ التصاعدي" ويظهر أسفل الزر رمي النرد مباشرةً. عند النقر على الزر العدّ التصاعدي، يجب أن يحصل على القيمة الحالية لعرض نص النتيجة، ويضيف إليها 1، ويعدّل عرض النص. احرص على التعامل مع الحالات الهامشية التالية:
- إذا كان عرض نص النتيجة لا يزال لا يحتوي على رقم (أي إذا كان عرض النص لا يزال يتضمّن السلسلة التلقائية "Hello World")، اضبط نص النتيجة على 1.
- إذا كان الرقم 6، لا تفعل شيئًا.
رمز حلّ تحدّي البرمجة
مشروع "استوديو Android": DiceRoller-challenge
الأنشطة
-
MainActivity
هو فئة فرعية منAppCompatActivity
، التي بدورها فئة فرعية منActivity
.Activity
هي فئة أساسية في Android مسؤولة عن رسم واجهة مستخدم تطبيق Android وتلقّي أحداث الإدخال. - تحتوي جميع الأنشطة على ملف تصميم مرتبط بها، وهو ملف XML في موارد التطبيق. يتم تسمية ملف التنسيق باسم النشاط، مثل
activity_main.xml
. - تربط الطريقة
setContentView()
فيMainActivity
التنسيق بالنشاط، وتوسّع هذا التنسيق عند إنشاء النشاط. - تضخيم التصميم هو عملية يتم فيها تحويل طرق العرض المحدّدة في ملفات تصميم XML إلى كائنات عرض Kotlin (أو "تضخيمها") في الذاكرة. بعد اكتمال عملية تضخيم التصميم، يمكن
Activity
رسم هذه العناصر على الشاشة وتعديلها بشكلٍ ديناميكي.
الملفات الشخصية
- جميع عناصر واجهة المستخدم في تخطيط التطبيق هي فئات فرعية من الفئة
View
وتُسمى طرق العرض. TextView
وButton
هما مثالان على طرق العرض. - يمكن تجميع عناصر
View
داخلViewGroup
. تعمل مجموعة العرض كحاوية للعروض أو مجموعات العرض الأخرى بداخلها. LinearLayout
هو مثال على مجموعة طرق عرض ترتّب طرق العرض الخاصة بها بشكل خطي.
عرض السمات
- تشير السمتان
android:layout_width
وandroid:layout_height
إلى وزن العرض وارتفاعه. تعمل القيمةmatch_parent
على توسيع العرض إلى عرض أو ارتفاع العنصر الرئيسي. تقلّص القيمةwrap_content
حجم العرض ليناسب محتواه. - تشير السمة
android:text
إلى النص الذي يجب أن يعرضه أحد عناصر العرض (إذا كان هذا العنصر يعرض نصًا). بالنسبة إلى الأزرار،android:text
هو تصنيف الزر. - ترتّب السمة
android:orientation
في مجموعة عرضLinearLayout
عناصر العرض التي تحتوي عليها. تؤدي القيمةhorizontal
إلى ترتيب طرق العرض من اليسار إلى اليمين. تؤدي القيمةvertical
إلى ترتيب طرق العرض من الأعلى إلى الأسفل. - تحدّد السمة
android:layout_gravity
موضع العرض وجميع العناصر الثانوية لهذا العرض. - تحدّد السمة
android:textSize
حجم النص في عرض النص. يتم تحديد أحجام النص بوحدات sp (وحدات بكسل قابلة للتوسّع). باستخدام وحدات sp، يمكنك تحديد حجم النص بشكل مستقل عن جودة عرض الجهاز.
السلاسل
- بدلاً من الترميز الثابت للسلاسل في التصميم، من أفضل الممارسات استخدام موارد السلاسل.
- يتم تضمين موارد السلسلة في ملف
values/res/string.xml
. - لاستخراج السلاسل، استخدِم
Alt+Enter
(Option+Enter
على جهاز Mac). اختَر استخراج موارد السلاسل من القائمة المنبثقة.
استخدام طرق العرض
- لربط رمز Kotlin بعنصر عرض حدّدته في التصميم، عليك الحصول على مرجع إلى عنصر العرض بعد أن يتم تضخيمه. عيِّن معرّفًا (
android:id
) للعرض في التصميم، ثم استخدِم طريقةfindViewById()
للحصول على عنصر العرض المرتبط. - عند إنشاء معرّف لعنصر عرض في ملف تنسيق XML، ينشئ Android Studio ثابتًا صحيحًا باسم هذا المعرّف في الفئة
R
التي تم إنشاؤها. يمكنك بعد ذلك استخدام مرجعR.id
هذا في طريقةfindViewById()
. - يمكنك ضبط سمات عنصر العرض في رمز Kotlin مباشرةً حسب اسم السمة. على سبيل المثال، يتم تحديد النص في عرض النص من خلال السمة
android:text
في XML، ويتم تحديده من خلال السمةtext
في Kotlin. - معالج النقرات هو طريقة يتم استدعاؤها عندما ينقر المستخدم على أحد عناصر واجهة المستخدم. لربط طريقة معالجة النقرات بعرض، مثل زر، استخدِم الطريقة
setOnClickListener()
.
استخدام الإشعارات المنبثقة
الإشعار المنبثق هو طريقة عرض تُظهر للمستخدم رسالة بسيطة في نافذة منبثقة صغيرة.
لإنشاء إشعار مؤقت، استدعِ طريقة المصنع makeText()
في الفئة Toast
باستخدام ثلاثة وسيطات:
- سياق التطبيق
Activity
- الرسالة التي سيتم عرضها، مثل مورد سلسلة
- مدة، مثلاً
Toast.LENGTH_SHORT
لعرض الإعلام المنبثق، استدعِ الدالة show()
.
دورة Udacity التدريبية:
مستندات مطوّري تطبيقات Android:
- التعرّف على "استوديو Android"
- التنسيقات
View
Button
TextView
- نظرة عامة على مراجع التطبيق
- نظرة عامة على أحداث الإدخال
findViewById()
setOnClickListener()
Context
غير ذلك:
يسرد هذا القسم مهامًا منزلية محتملة للطلاب الذين يعملون على هذا الدرس التطبيقي العملي كجزء من دورة تدريبية يقودها مدرّب. على المعلّم تنفيذ ما يلي:
- حدِّد واجبًا منزليًا إذا لزم الأمر.
- توضيح كيفية إرسال الواجبات المنزلية للطلاب
- وضع درجات للواجبات المنزلية
يمكن للمدرّبين استخدام هذه الاقتراحات بالقدر الذي يريدونه، ويجب ألا يترددوا في تكليف الطلاب بأي واجبات منزلية أخرى يرونها مناسبة.
إذا كنت تعمل على هذا الدرس العملي بنفسك، يمكنك استخدام مهام الواجب المنزلي هذه لاختبار معلوماتك.
تغيير تطبيق
افتح تطبيق DiceRoller. أضِف زرًا إلى التطبيق يحمل اسم "إعادة الضبط" (Reset) ويظهر أسفل الزر رمي النرد مباشرةً. اجعل هذا الزر يعيد ضبط عرض النص الخاص بالنتيجة إلى 0.
الإجابة عن هذه الأسئلة
السؤال 1
أيّ طريقة في Activity
تزيد من حجم تصميم التطبيق وتتيح عرض المشاهدات كعناصر؟
onCreate()
setClickListener()
setContentView()
show()
السؤال 2
ما هي سمة طريقة العرض التي تستخدمها لضبط عرض طريقة العرض بحيث يتم تعديلها لتناسب المحتوى؟
android:view_width="wrap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="match_parent"
إرسال تطبيقك للحصول على درجة
يُرجى التأكّد من أنّ التطبيق يتضمّن ما يلي:
- يجب أن يتضمّن تخطيط التطبيق عرضًا نصيًا واحدًا وزرَّين.
- يجب أن يضبط رمز التطبيق معالجَين للنقرات، أحدهما لكل زر.
- يجب أن يضبط معالج النقرات الذي يعيد ضبط عرض النص خاصية النص على 0.
ابدأ الدرس التالي:
للحصول على روابط تؤدي إلى دروس تطبيقية أخرى في هذه الدورة التدريبية، اطّلِع على الصفحة المقصودة الخاصة بالدروس التطبيقية حول أساسيات Android Kotlin.