7 – تشغيل فعالية أخرى Starting Another Activity

ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development

تشغيل فعالية أخرى Starting Another Activity

السلام عليكم ورحمة الله وبركاته

سنتابع في هذا الدرس عند النقطة التي توقفنا عندها في الدرس الماضي , حيث كنا قد بنينا في الدرس الماضي واجهة مستخدم بسيطة ضمن اندرويد تحوي على حقل نصي text field بالاضافة إلى زر button , وضمن هذا الدرس نرغب ببرمجة الاستجابة التي نريد عندما يضيف المستخدم نص ضمن الحقل النصي وينقر على الزر المجاور له.

ملاحظة : هنالك بعض المصطلحات لن نقوم بترجمتها – على سبيل المثال : intent- وذلك حتى لا تصبح الترجمة مضللة.

سوف يعلمنا هذا الدرس الأمور التالية:

  1. الاستجابة لنقر الزر
  2. بناء Intent – (تذكرة ب Intent راجع الدرس الثاني)
    تشغيل فعالية ثانية    starting another activity
  3. انشاء فعالية ثانية Create the Second Activity
  4. تلقي ال Intent
  5. عرض الرسالة

لمزيد من المعلومات عن Intent  بإمكانكم مراجعة الدرس الثاني ::

  مكونات واجهة المستخدم الاساسية في اندرويد Basic Andorid User Interface Components

بعد ان انتهينا في الدرس الماضي من اعداد واجهة المستخدم, اصبح بحوزتنا تطبيق يحوي (بشاشة مفردة single screen) على فعالية Activity مزودة بحقل نصي text field مع زر.

ضمن هذا الدرس سوف نضيف بعض الترميز ( الكود) إلى ملف  MainActivity  الذي بدوره (اي الترميز) سيقوم بتشغيل فعالية جديدة عند نقر المستخدم على زر “Send” .

الاستجابة لنقر زر الارسال Respond to the Send Button

لكي نحقق الاستجابة التي نريد الناتجة عن حدث نقر الزر, سوف نفتح ملف التنسيق activity_main.xml ونضيف خاصية android:onClick إلى عنصر <Button>.

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

سوف نسند إلى خاصية android:onClick القيمة "sendMessage", وهذه القيمة عبارة عن اسم التابع (الوظيفة) method or function  الموجود ضمن الفعالية activity , والذي سوف يقوم النظام باستدعاءه عند نقر المستخدم للزر.

سوف نفتح الصف MainActivity الموجود ضمن المسار التالي (src/) وسنضيف إلى الكود (الترميز) التابع "sendMessage" الذي تحدثنا عنه منذ قليل:

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

في البداية نحن بحاجة إلى استيراد الصف View عبر الرماز التالي :

import android.view.View;

ملاحظة : ضمن Eclipse  , بإمكانك عبر النقر على Ctrl + Shift + O  باستيراد الصفوف الناقصة ( او بواسطة Cmd + Shift + O  ضمن نظام Mac).

لكي يستطيع النظام ان يطابق بين هذا التابع (الوظيفة)  المذكور ضمن صف MainActivity  وبين اسم التابع (الوظيفة) المذكور ضمن خاصية android:onClick التابعة للزر, فإنه يتوجب على توقيع التابع (الوظيفة)  method signature ان يحقق ما يلي :

  • ان يكون public
  • ان يرد قيمة من نمط void
    ان يحوي على معامل parameter وحيد وهو  View ( وهو عبارةعن ال View الذي نُقر عليه).

فيما يلي سوف نقوم بوضع الرماز المناسب للتابع (الوظيفة) "sendMessage" والمسئول عن قراءة محتويات الحقل النصي text field ونقل محتواه إلى فعالية أخرى.

بناء ال Intent

ال Intent عبارة عن غرض يزودنا بالربط بين المكونات المنفصلة في زمن التنفيذ ( على سبيل المثال عملية الربط بين فعاليتين two activities ).

تمثل ال Intent – ان جاز التعبير – “نية التطبيق للقيام بعمل ما”.

بإمكانك استخدام ال Intent لعدة مهام مختلفة, ولكنها غالبا ما تستخدم لتشغيل فعالية أخرى.

ضمن ترميز تابع (الوظيفة) sendMessage(), سوف نقوم بإنشاء Intent لتقوم بتشغيل فعالية تدعى ب : DisplayMessageActivity

Intent intent = new Intent(this, DisplayMessageActivity.class);

لدى الباني constructor المستخدم هنا معاملين two parameters:

  • Context : عبارة عن المعامل الأول( تم استخدام “this" لأن صف ال Activity عبارة عن صف مشتق من ال Context).
  • ال Class الخاص بمكون التطبيق الذي يتوجب على النظام نقله إلى ال Intent(وفي حالتنا فهو عبارة عن الفعالية activity التي يتوجب تشغيلها).

ارسال ال Intent إلى تطبيقات أخرى  Sending an intent to another apps

إن ال Intent  التي سيتم استخدامها ضمن هذا الدرس, تعتبر Intent  صريحة “explicit intent” , وذلك لأن ال Intent قد حددت مكون التطبيق app’s component بشكل محدد(أي المكون الذي يتوجب ارسال ال intent له , وفي حالتنا هي عبارة عن فعالية أخرى).

 على كل الأحوال ,فإنه يمكن لل Intent ان تكون ضمنية (غير صريحة) implicit, وعندها لا تقوم ال Intent بتحديد المكون component المطلوب, ولكنها تمكن أي تطبيق مثبت على الجهاز من الاستجابة لل Intent مادام مستوفي للمواصفات ال meta-data الخاصة بالحدث المحدد ضمن معاملات ال Intent.

لمزيد من المعلومات, بإمكانكم الاطلاع على  Interacting with Other Apps.

ملاحظة : الاشارة ضمن الرماز إلى DisplayMessageActivity  ستسبب خطأ وذلك في حال كنت تستخدم بيئة عمل مثل Eclipse, وذلك لأن الصف ليس موجودا بعد. تجاهل هذا الخطأ في الوقت الحالي, وسنقوم فيما بعد بإنشاء هذا الصف.

لا تسمح ال Intent ببدأ تشغيل فعالية اخرى فحسب, وانما تستطيع ايضا ان تنقل حزمة من البيانات إلى فعالية اخرى ايضا.

ضمن تابع (وظيفة) sendMessage()  , سوف نستخدم التابع findViewById() وذلك بهدف الحصول على عنصر EditText واضافة قيمته النصية إلى ال Intent.

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

ملاحظة : الآن نحن بحاجة إلى عبارات الاستيراد التالية android.content.Intent و android.widget.EditText .

وسنقوم ايضا بتعريف الثابت EXTRA_MESSAGE.

يستطيع ال Intent نقل مجموعة متنوعة من أنماط المعطيات وذلك على شكل ثنائيات(مفتاح – قيمة) key-value  , وتدعى ب extras.

ياخذ تابع (وظيفة) putExtra() اسم المفتاح كمعامل أول, والقيمة الموافقة له كمعامل ثاني.

لكي تستطيع الفعالية الآخرى الاستعلام عن هذه البيانات الاضافية المحملة ضمن ال  Intent, يتوجب علينا تعريف اسم المفتاح الخاص بالبيانات التي نريد الاستعلام عنها, لذلك سوف نقوم هنا بتعريف اسم المفتاح EXTRA_MESSAGE كثابت عام.

اذن سنضيف تعريف EXTRA_MESSAGE في أعلى صف MainActivity:

 

public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}

من الممارسات المفيدة جدا اثناء البرمجة ان نقوم بتعريف اسماء المفاتيح الخاصة باضافات ال Intent  intent’s extras عبر الاستفادة من اسم حزمة التطبيق اثناء التسمية, وذلك بأن نضع اسم حزمة التطبيق على شكل سابقة لاسم المفتاح. هذا يساعدنا على تجنب التضارب, وذلك في حال تفاعل تطبيقنا مع تطبيقات أخرى.

تشغيل الفعالية الثانية Start the Second Activity

لتشغيل الفعالية, سيتم استدعاء تابع startActivity() ونمرر له ال  Intent. سيقوم النظام بتلقي هذا الاستدعاء ويشغل نسخة من الفعاليةActivity  instance of the  المحددة من قبل ال Intent .

اذن , سيبدو تابع  sendMessage() بعد اتمام اضافة الرماز ( الكود) المطلوب له كما يلي :

(ملاحظة : سيتم استدعاء تابع sendMessage() من قبل زر “Send” اثناء النقر على الزر).

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

عند هذه النقطة , نحن بحاجة لإنشاء صف DisplayMessageActivity  لكي يعمل الرماز الذي قمنا بكتابته.

بناء الفعالية الثانية Create the Second Activity

الشكل 1 : النافذة التي تظهر عند محاولة انشاء فعالية activity جديدة ضمن Eclipse.

الشكل 1 : النافذة التي تظهر عند محاولة انشاء فعالية activity جديدة ضمن Eclipse.

لإنشاء فعالية Activity جديدة ضمن Eclipse :

  1. انقر على New  ضمن شريط الأدوات.
  2. 2.       ضمن النافذة التي سوف تظهر لنا, افتح مجلد Android واختر Android Activity , ومن ثم انقر Next.
  3. 3.       قم باختيار  BlankActivity ثم انقر Next.
  4. املأ تفاصيل الفعالية activity بما يلي :
  5. Project: MyFirstApp
  6. Activtity Na: DisplayMessageActivity
  7. Layout Name: activity_display_message
  8. Title: My Message
  9. Hierarchial Parent: : com.example.myfirstapp.MainActivity
  10. Navigation Type: None
  11. انقر Finish.

 في حال كنت تستخدم بيئة عمل مختلفة أو كنت تستخدم أدوات سطر الأوامر, انشأ ملف جديد باسم DisplayMessageActivity.java , وذلك ضمن مسار src/ضمن المشروع, أي بجوار ملف MainActivity.java.

افتح الملف DisplayMessageActivity.java.

في حال كنت قد استخدمت Eclipse لإنشاء الفعالية سوف تجد مايلي:

  • فإن الصف يحوي على بشكل افتراضي على التنجيز (الرماز) الخاص بتابع (وظيفة) onCreate().
  • هنالك ايضا تنجيز(رماز) خاص بتابع (وظيفة) onCreateOptionsMenu(), ولكننا لا نحتاجها فيما يخص هذا التطبيق , لذلك سوف نقوم بإزالتها.
  • هنالك ايضا تنجيز (كود) خاص بتابع(وظيفة) onOptionsItemSelected(), دع هذا الرماز كما هو.

يجب ان يبدو الصف كما يلي :

public class DisplayMessageActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        // Show the Up button in the action bar.
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

أما في حالة كنت قد استخدمت بيئة تطوير مختلفةعن eclipse  فعليك اضافة الترميز السابق إلى صف DisplayMessageActivity.

كل الصفوف المشتقة من صف Activity يجب عليها ان تنجز implement التابع onCreate(). يقوم النظام باستدعاء هذا التابع onCreate() عندما ينشأ مستنسخ Instance من النشاط activity .

ويمثل هذا التابع onCreate() المكان المناسب لما يلي :

  • المكان المناسب الذي يتوجب فيه تعريف تنسيق الفعالية activity layout وذلك بواسطة تابع setContentView() .
  • ايضا يمثل التابع onCreate() المكان المناسب لتنفيذ ووضع الإعدادات المبدئية الخاصة بمكونات الفعالية activity components.

اضافة السلسلة المحرفية الخاصة بالعنوان Add the title string

في حال كنت تستخدمون eclipse  كبيئة عمل , فبإمكانكم تجاوز هذا المقطع , وذلك لأن قالب الفعالية  activity template  ضمن eclipse  يزودنا بالسلسلة المحرفية الخاصة بعنوان الفعالية الجديدة.

أما في حال كنت تستخدم بيئة عمل غير eclipse, فعليك بإضافة عنوان الفعالية activity’s title وذلك ضمن ملف strings.xml:

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

اضافة الفعاليةإلى ال manifest

يجب ان يتم تصريح كل الفعاليات activities ضمن ملف ال manifest, AndroidManifest.xml.

يتم تصريح الفعاليات باستخدام عنصر <activity>.

عندما نستخدم ادوات eclipse  لإنشاء الفعالية, فإنه ينشأ مدخل افتراضي <activity> ضمن ملف AndroidManifest.xml .

أما في حال كنت تستخدم بيئة عمل اخرى, فإنك بجاجة غلى ان تنشأ مدخل ال manifest للفعالية ” <activity> ” بنفسك. ويجب ان يبدو كما يلي :

<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

تصرح خاصية android:parentActivityName عن اسم الفعالية الأب لهذه الفعالية ضمن التسلسل الهرمي للتطبيق.

يستخدم النظام هذه القيمة لتنفيذ سلوكيات الانتقال الافتراضية, مثل  Up navigation ضمن اندرويد 4.1 (API level 16) أو أعلى. بإمكاننا توفير نفس سلوكيات الانتقال للاصدارات القديمة من اندرويد عبر استخدام  Support Library واضافة عنصر<meta-data> كماهو مبين هنا.

ملاحظة : يجب ان يحوي Android SDK اخر واحدث مكتبات الدعم الخاصة باندرويد Android Support Library. وهي مضمنة ضمن حزمة ADT , اما في حال كنت تستخدم بيئة عمل مختلفة, فيتوجب عليك تثبيتها خلال مرحلة “اضافة الحزم ومنصات العمل”  Adding Platforms and Packages. عند استخدام القوالب ضمن Eclipse, فإنه يتم اضافة مكتبة الدعم support library بشكل اوتوماتيكي لمشروعك. اما في حال لم تكن تستخدم eclipse, فعندها يتوجب عليك ان تقوم بإضافة المكتبات بشكل يدوي إلى المشروع – تتبع الخطوات المشروحة ضمن “اعداد مكتبات الدعم” setting up the Support Library ثم عد إلى هنا.

في حال كنت تطور ضمن اطار بيئة عمل eclipse, فإنه اصبح بإمكانك تشغيل التطبيق الآن, ولكن لا تتوقع كثيرا .

بالنقر على زر “Send” فإن الفعالية الثانية سوف تشتغل, وسوف تظهر على الشاشة عبارة “Hello world” المزودة بشكل افتراضي من قبل القالب. لذلك سوف نقوم بتعديل الفعالية لتعرض لنا النص الذي نريد.

استقبال وتلقي ال Inetnt:

يتم استدعاء كل فعالية Activity  بواسطة ال Intent, وذلك بعض النظر عن آلية تجوال المستخدم بين الفعاليات.

بإمكانك الحصول على ال Intent التي قامت بتشغيل نشاطك عبر استدعاء getIntent() واستعادة المعطيات التي كانت مضمنة ضمنها.

ضمن تابع (وظيفة) onCreate() الخاصة بصف DisplayMessageActivity , نقوم بالحصول على ال intent واستخلاص الرسالة المنقولة من قبل MainActivity.

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

عرض الرسالة

لإظهار الرسالة على الشاشة, قم بإنشاء غرض TextView خاص بعرض النص, وسوف نسند النص إليه عبر setText().

ومن ثم نضيف ال TextView ضمن تنسيق الفعالية activity layout وذلك عبر تمريرها إلى تابع setContentView().

فيما يلي ادناه نظهر الترميز الكامل لتابع ( وظيفة) onCreate() الخاصة ب DisplayMessageActivity.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

بإمكانك الآن تشغيل التطبيق.

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

الشكل 2: واجهة الفعاليتين في التطبيق النهائي ,بتشغيله على Android 4.0.

الشكل 2: واجهة الفعاليتين في التطبيق النهائي ,بتشغيله على Android 4.0.

وبذلك نكون قد انتهينا من بناء تطبيق اندرويد الأول.

لتتعلموا المزيد عن بناء تطبيقات اندرويد, تابعوا معنا هذه السلسلة البسيطة السهلة في البرمجة والتطوير ضمن اندرويد.

وعند هذه النقطة نكون قد انتهينا من شرح كيفية بناء وتشغيل تطبيق بسيط باندرويد, وإلى اللقاء في الدرس المقبل الذي سنتحدث فيه عن مثال اخر حول بناء واجهة المستخدم UI, وذلك لكي نتجاوز هذه المرحلة وقد شعرنا تمام بإتقاننا لها, ويتحدث الدرس القادم عن بناء تطبيق للتحويل بين درجات الحرارة.

وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة الله وبركاته.

 

المصطلح

الترجمة

Class

صف

Intent

سوف تترك كما هي intent حتى لا يصبح المعنى مضللاً

Activity

فعالية

Method or function

تابع – وظيفة : ( اي تابع برمجي يقوم بوظيفة معينة)

Call

استدعاء

implement

تنجيز

Instance

مستنسخ

components

مكونات

Object

غرض

ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development

تحوي سلسلة اندرويد المواضيع التالية :

  1. التعريف باندرويد What is Android
  2. مكونات واجهة المستخدم الاساسية في اندرويد Basic Andorid User Interface Components
  3. خطوات تثبيت اندرويد Android Install Steps
  4. بناء مشروع اندرويد
  5. تشغيل تطبيقك على اندرويد Running Your Application  
  6. بناء واجهة مستخدم بسيطة UI 
  7. تشغيل فعالية أخرى Starting another Activity
  8. بناء مشروع اندرويد – التحويل بين درجات الحرارة Android Temperature Converter
Advertisements

, , , , , , ,

  1. #1 by Sako Abed Alrhman on أكتوبر 9, 2014 - 3:58 ص

    السلام عليكم أخي العزيز
    ممكن طلب صغير …. لو تقدر تنزل الكود كله لو تكرمت كود الجافا و كود xml

اترك رد

Please log in using one of these methods to post your comment:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: