في السابق عندما نريد الانتقال إلى شاشة أخرى فإننا نستخدم دالة startActivity() لكن هذه الدالة لا يمكنها ارجاع بيانات إلى الشاشة الحالية التي تم الانتقال منها . على سبيل المثال عندما تكون لديك شاشة يقوم المتخدم فيها بإدخال بيانات مثل أـسم المستخدم وكلمة المرور ومن ثم إرجاع تلك البيانات إلى الشاشة السابقة التي تم الانتقال منها لكي تمت معالجة تلك البيانات .
بصورة أوضح لو فرضنا إن الشاشة الحالية A ومن ثم تم الانتقال من الشاشة A إلى الشاشة B وإدخال بيانات في الشاشة B ومن ثم إرجاع تلك البيانات مرة أخرى إلى الشاشة A .
تتم هذه العملية باستخدام الدالة startActivityForResult() وببساطة تقوم هذه الدالة هو الانتقال إلى شاشة وارجاع بيانات منها إلى الشاشة الحالية.
وسنتعلم في هذا الدرس مايلي:
1-كيفية تمرير البيانات البيانات بين شاشتين.
2-كيفية استرجاع بيانات بين الشاشات.
ولمشاهدة الدرس بالكامل يرجى مشاهدة الفيديو:
1-كيفية تمرير البيانات البيانات بين شاشتين.
سنتعلم الان كيفية تمرير البيانات بين شاشتين ولفهم ذلك نقوم بانشاء مشروع جديد وفكرة المثال انه يتم ادخال بيانات في مربع النص ثم عند الضغط على الزر
يتم إرسال بيانات إلى activtiy2 .
1-فتح اندرويد استديو وإنشاء مشروع جديد نسميه PassingDataUsingIntent.
2-نقوم بإنشاء شاشتين في المشروع MainActivity و Activity2.
3-نقوم بتصميم الشاشة MainActivity نذهب إلى الملف activity_main.xml ونقوم بإضافة مربع نص و زر كما في الكود ادناه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.blogspot.muteealjabri.passingdatausingintent.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txt" android:layout_alignParentLeft="true" android:layout_alignParentRight="true"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/txt" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:text="Send" android:onClick="pass"/> </RelativeLayout> |
لتظهر الشاشة بالشكل التالي كما في الصورة:
4-بنفس الطريقة نقوم بتصميم الشاشة Activity2 نذهب إلى الملف activity2.xml ونقوم بإضافة مربع نص و زر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.blogspot.muteealjabri.passingdatausingintent.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txt" android:layout_alignParentLeft="true" android:layout_alignParentRight="true"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/txt" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:text="Send" android:onClick="pass"/> </RelativeLayout> |
لتظهر الشاشة كما يلي:
5- نذهب إلى الملف MainActivity نقوم بكتابة هذا الكود في دالة حدث الضغط
على الزر Send وذلك لاننا نريد إرسال بيانات من MainActivity إلى Activity2 زنقوم بكتابة الكود الاتي:
1 2 3 4 5 6 7 | public void pass(View view){ Intent intent = new Intent(MainActivity.this,Activity2.class); Bundle bundle = new Bundle(); bundle.putString("name",txt.getText().toString()); intent.putExtras(bundle); startActivityForResult(intent,requestCode); } |
نقوم الان بشرح الاكواد اعلاه:
السطر2: انشاء اوبجكت من intent.
السطر3: إنشاء من Bundle وسيتم أستخدام هذا الاوبجكت لتمرير البيانات عل
شكل Key/Value.
السطر4: تحديد البيانات المراد إرسالها باستخدام الدالة putString ويتم تمرير لها:
-name": وهو عبارة عن
مفتاح يشير إلى القيمة التي سيتم إرسالها.
-البيانات المراد إرسالها: وهي القيمة المرسلة ويتم الحصول عليها من مربع النص
ومن خلال الداله tx.getText().toString().
السطر 5: اضافة البيانات المراد إرسالها إلى Intent
Object.
السطر6: الانتقال إلى Activity2 وتمرير البيانات باستخدام
الدالة startActivityForResult() حيث تستقبل هذه الدالة
بارميترين:
1-Intent: وهو الـ Intent الذي
تريد الانتقال من خلاله إلى الشاشة Activity2.
2-requestCode: وهو عبارة عن عدد صحيح
يعتبر معرف للبيانات التي يتم إرسالها. الان تم إرسال البيانات من MainActivity سنتعلم كيفية استقبال تلك البيانات في Activity2 ونقوم بالاتي:
1 2 3 4 5 6 7 8 9 10 11 | txt=(EditText)findViewById(R.id.txt); Bundle bundle = getIntent().getExtras(); String defaultName =bundle.getString("name"); if(bundle!= null){ txt.setText(defaultName); }else{ txt.setText("No data"); } |
نقوم الان بشرح الاكواد اعلاه:
السطر 1: إنشاء View من مربع النص الذي نريد وضع البيانات التي نريد استقبالها.
السطر2: استدعاء الدالة getIntent() وذلك لارجاع اوبجكت من نوع Intent الذي
تم بواسطته الانتقال لهذه الشاشة وهي Activity2 . ثم بعد ذلك استدعاء الداله getExtras() التي ترجع اوبجكت من نوع Bundle الذي يحتوي على البيانات المرسلة.
السطر 3: استخراج البيانات من خلال استدعاء الدالة getString("name") ومن ثم تمرير المفتاح الذي يشير للبيانات المرسلة وهو Name ومن ثم وضع القيمة في المتغير النصي defualtname.
السطر 5: فحص فيما إذا الكائن من نوع bundle غير فارغ وهو ما يعني أنه تم استقبال البيانات بنجاح.
الاسطر 7-8: في حالة لم يتم استقبال البيانات يتم وضع جملة "No data" في مربع النص.
2-كيفية استرجاع بيانات بين الشاشات.
ولتوضيح ذلك نعود للمثال السابق ونقوم ببعض التعديلات وهي كمايلي:
1- نذهب إلى ملف MainActivity ونكتب الكود التالي في دالة حدث الغط الزر send:
1 2 | Intent intent = new Intent(MainActivity.this,Activity2.class); startActivityForResult(intent,requestCode); |
حيث يقوم الكود أعلاه بالانتقال إلى الشاشة Activity2.
2-نذهب إلى الملف Activity2نقوم
بكتابة هذا الكود في داله حدث الضغط على الزر pass data bacK : 1 2 3 4 | Intent intent = new Intent(); intent.setData(Uri.parse(txt.getText().toString())); setResult(RESULT_OK,intent); finish(); |
والان نقوم بشرح الكود
السطر 1:انشاء اوبجكت من نوع Intent.
السطر2:تحديد نوع البيانات المراد إرجاعها وذلك باستخدام الدالة setData()ومن ثم تمرير القيمة المدخلة في المربع النصي txt.
السطر3: استدعاء الدالة setResult() ويتم تمرير بارميترين لهذه الدالة وهي:
-RESULT_OK : وهو كود حالة النتيجة
التي سيتم إرسالها RESULT_OK يعني أنه سيتم إرسال البيانات بنجاح.
-Intent : وهو اوبجكت من نوع Intent الذي سيتم ارجاعه للشاشة السابقة .
السطر 5: استدعاء الدالة finish() واغلاق الشاشة الحالية وهي activity2 والرجوع إلى الشاشة السابقة وتمرير البيانات
لها.
كيفية استرجاع البيانات التي تم إرسالها
كيفية استرجاع البيانات التي تم إرسالها
عند الرجوع من الشاشة Activity2 إلى الشاشة mainActivity يتم
استدعاء الدالة onActivityResult:
ويتم ااستخدام هذه الدالة لاسترجاع البيانات التي تم إرسالها وتستقبل
هذه الدالة ثلاثة بارميترات:
1-:requestCode وهو كود معرف النتيجة
التي إرسالها.
2-resultCode: وهو كود حالة نتيجة
إرسال البيانات الذي تم اسناده في الـ intent الذ تم إرساله من Activity2.
3-data: وهو اوبجكت من نوع Intent
الذي يحتوي على البيانات
التي تم إرسالها .لذلك نقوم بالعودة إلى MainActivity ونعمل اوفرايد Override للدالة onActivityResult كمايلي:
1 2 3 4 5 6 7 8 9 | @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==requestCode){ if(resultCode==RESULT_OK){ txt.setText(data.getData().toString()); } } } |
السطر 4:فحص فيما إذا كان معرف النتيجة المرسل يتطابق مع المعرف التي
تم استقباله.
السطر 5: في حالة تطابق المعرف. يتم فحص كود حالة النتيجة
المرسلة ’ مع الكود الذي تم تحديده في الدالة setResult().
السطر 6: ارجاع البيانات من الـ Intent باستخدام دالة getData().toString()'
ووضع القيمة في مربع النص.وهنا وصلنا إلى نهاية الدرس رأيكم يهمني بالتعليقات ولاتنسى الاشتراك بقناتنا على اليوتيوب.
هنا الكود الكامل للدرس: للتحميل اضغط هنا