القائمة الرئيسية

الصفحات

الدرس 15-شرح كيفية نقل البيانات بواسطة الـ intent في الاندرويد



في السابق عندما نريد الانتقال إلى شاشة أخرى فإننا نستخدم دالة startActivity()   لكن هذه الدالة لا يمكنها ارجاع بيانات إلى الشاشة الحالية التي تم الانتقال منها . على سبيل المثال عندما تكون لديك شاشة يقوم المتخدم فيها بإدخال بيانات مثل أـسم المستخدم وكلمة المرور  ومن ثم إرجاع  تلك البيانات إلى الشاشة السابقة التي تم الانتقال منها لكي تمت معالجة تلك البيانات .



بصورة أوضح لو فرضنا إن الشاشة الحالية  ومن ثم تم الانتقال من الشاشة  إلى الشاشة   وإدخال بيانات في الشاشة  ومن ثم  إرجاع تلك البيانات مرة أخرى إلى الشاشة .
تتم هذه العملية باستخدام الدالة 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-نذهب إلى Activit2  ونكتب الكود التالي في دالة onCreate: 


 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  غير فارغ وهو ما يعني أنه تم استقبال البيانات بنجاح.

السطر 6:وضع قيمةالبيانات التي تم استلامها في مربع النص من خلال الدالة setText.

الاسطر 7-8:  في حالة لم يتم استقبال البيانات  يتم وضع جملة "No data" في مربع النص.




2-كيفية استرجاع بيانات بين الشاشات.


سنتعلم الان كيفية استرجاع البيانات . باستخدام الـ Intent  وسنقوم بانشاء مثال وفكرته أنه سيتم الانتقال من MainActivity  إلى Activity2 ومن ثم سيتم إدخال بيانات في  Activity2 ويتم إرجاع تلك البيانات مرة أخرى إلى mainActivity .

ولتوضيح ذلك نعود للمثال السابق ونقوم ببعض التعديلات وهي كمايلي:

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()'
ووضع القيمة في مربع النص.

وهنا وصلنا إلى نهاية الدرس رأيكم يهمني بالتعليقات ولاتنسى الاشتراك بقناتنا على اليوتيوب. 

هنا الكود الكامل للدرس: للتحميل اضغط هنا