مقالات آموزشی

روش انتقال داده از یک اکتیویتی به اکتیویتی دیگر در اندروید استودیو

در ادامه آموزش اندروید استدیو به مبحثی بر میخوریم تحت عنوان انتقال داده از یک اکتیویتی به اکتیویتی دیگر در اندروید استودیو صفحات یا همان اکتیویتی ها توسط intent جابجا می شوند. هر اکتیویتی جدیدی که ایجاد می شود داخل حافظه ی رم قرار می گیرد. روند جابجایی با intent به اینصورت است که اکتیویتی ها روی هم قرار می گیرند و هربار با کلیک روی دکمه ی بک گوشی، اکتیویتی قبلی از حافظه ی رم خوانده شده و اجرا می شود . اما زمانی که میخواهیم یک اکتیویتی از حافظه ی رم پاک شود و اکتیویتی زیرین جایگزین آن شده و اجرا شود از finish استفاده می کنیم.

در هر دو حالت ، ممکن است بخواهیم با جابجایی اکتیویتی داده ای را انتقال دهیم . در این مقاله نحوه ی انتقال داده از یک اکتیوینی به اکتیویتی دیگر را آموزش می دهیم.

یک پروژه ی جدید ایجاد کنید. داخل صفحه ی main دو Button و یک TextView قرار دهید. Button ها برای انتقال به Activity2 و Activity3 و TextView برای نمایش داده.

activity_main.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="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_GoToActivity2"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:text="GoToActivity2"
        android:textSize="18sp" />

    <Button
        android:id="@+id/btn_GoToActivity3"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:text="GoToActivity3"
        android:textSize="18sp"
        android:layout_marginTop="10dp"/>

    <TextView
        android:id="@+id/tv_showInformation"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:padding="10dp"
        android:layout_marginTop="30dp"
        android:textSize="18sp"/>

</LinearLayout>

دو اکتیویتی به نام های Activity2 و Activity3 ایجاد کرده و داخل هر کدام یک Button برای بازگشت به صفحه ی main و یک EditText برای وارد کردن داده ، قرار دهید.

activity_2.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="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".Activity2">

    <Button
        android:id="@+id/btn_GoToMain_WithIntent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity2"
        android:textSize="20sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/edt_inputInformation_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="اطلاعات خود را وارد کنید:"
        android:padding="10dp"/>
</LinearLayout>

activity_3.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="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".Activity3">

    <Button
        android:id="@+id/btn_GoToMain_WithFinish"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity3"
        android:textSize="20sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/edt_inputInformation_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="اطلاعات خود را وارد کنید:"
        android:padding="10dp"/>
</LinearLayout>

انتقال داده از یک اکتیویتی به اکتیویتی دیگر

فرض کنید یک اکتیویتی توسط intent جابجا شده و به اکتیویتی دیگر می رود. در این حالت می خواهیم با جابجایی اکتیویتی ، داده ای را به اکتیویتی جدید انتقال دهیم.

Activity2.java:

داخل Activity2 کد زیر را وارد کنید:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Activity2 extends AppCompatActivity {
    Button btn_GoToMain_WithIntent;
    EditText edt_inputInformation_2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);

        btn_GoToMain_WithIntent = findViewById(R.id.btn_GoToMain_WithIntent);
        edt_inputInformation_2 = findViewById(R.id.edt_inputInformation_2);

        btn_GoToMain_WithIntent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Activity2.this , Intent_FinishActivity.class);
                i.putExtra("information_Activity2" , edt_inputInformation_2.getText().toString());
                startActivity(i);
            }
        });
    }
}

توضیح کد بالا:

ابتدا یک Button و یک EditText تعریف کرده سپس آن ها را findviewById می کنیم. می خواهیم با کلیک روی دکمه، توسط intent به صفحه ی main برگردیم و اطلاعات داخل EditText را به صفحه ی main انتقال داده و داخل TextView که در MainActivity قرار دارد نمایش دهیم.

برای Button متد setonClickListener نوشته و داخل آن یک intent برای جابجایی صفحه تعریف می کنیم وصفحه ای که در آن قرار داریم و صفحه ای که می خواهیم به آن منتقل شویم را مشخص می کنیم. سپس برای انتقال داده ، از putExtra استفاده می کنیم.  putExtra  قابلیت این را دارد که انواع مختلفی از داده ها (int،String،float، double و …) را انتقال دهد که نوع داده  ی ما در این قسمت String می باشد.

putExtra   بصورت key/value کار می کند به این منظور که دارای یک نام و یک مقدار می باشد. پس برای انتقال داده لازم است یک نام و یک مقدار برای آن تعریف کنیم.

نام داده را information_Activity2 قرار دادیم و برای مقدار آن ، داده ی داخل EditText را گرفتیم. در آخر نیز با استفاده از  StartActivity به صفحه ی MainActivity ، منتقل می شویم.

حالا فرض کنید یک اکتیویتی توسط finish حذف شده و اکتیوتی قبلی اجرا می شود چگونه داده ای را از اکتیویتی حذف شده به اکتیویتی قبلی انتقال دهیم؟

Activity3.java:

داخل Activity3 کد زیر را وارد کنید:

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Activity3 extends AppCompatActivity {

    Button btn_GoToMain_WithFinish;
    EditText edt_inputInformation_3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_3);

        btn_GoToMain_WithFinish = findViewById(R.id.btn_GoToMain_WithFinish);
        edt_inputInformation_3 = findViewById(R.id.edt_inputInformation_3);

        btn_GoToMain_WithFinish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.putExtra("information_Activity3" , edt_inputInformation_3.getText().toString());
                setResult(Activity.RESULT_OK , i);
                finish();
            }
        });
    }
}

توضیح کد بالا:

ابتدا یک Button و یک EditText تعریف کرده سپس آن ها را findviewById می کنیم. می خواهیم با کلیک روی دکمه، توسط finish به صفحه ی main برگردیم و اطلاعات داخل EditText را به صفحه ی main انتقال داده و داخل TextView که در MainActivity قرار دارد نمایش دهیم.

برای Button متد setonClickListener می نویسیم.برای انتقال اطلاعات توسط finish کافیست فقط یک intent تعریف کنیم بدون اینکه صفحه ای که در آن قرار داریم و صفحه ای که می خواهیم به آن منتقل شویم را مشخص کنیم. سپس مانند کدهای قبلی برای انتقال داده ، از putExtra استفاده کرده و یک نام و یک مقدار برای داده ی خود تعریف می کنیم.

همچنین لازم است برای داده ی خود SetResult تعریف کرده و به ورودی های آن RESULT_OK و intent را بدهیم. در آخر نیز توسط finish به MainActivity منتقل می شویم.

گرفتن داده از یک اکتیویتی و نمایش آن در اکتیویتی جدید

تا اینجا آموزش دادیم چگونه داده ای را از یک اکتیویتی به اکتیویتی دیگر انتقال دهیم. اما حالا می خواهیم ببینیم چگونه داده ای که انتقال دادیم را بگیریم و آن را نمایش دهیم.

MainActivity.java:

داخل MainActivity کد زیر را وارد کنید:

import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button btn_GoToActivity2, btn_GoToActivity3;
    TextView tv_showInformation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_GoToActivity2 = findViewById(R.id.btn_GoToActivity2);
        btn_GoToActivity3 = findViewById(R.id.btn_GoToActivity3);
        tv_showInformation = findViewById(R.id.tv_showInformation);

        btn_GoToActivity2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent_FinishActivity.this, Activity2.class);
                startActivity(i);
            }
        });

        btn_GoToActivity3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent_FinishActivity.this, Activity3.class);
                startActivityForResult(i ,3);
            }
        });


        String information = getIntent().getStringExtra("information_Activity2");
        tv_showInformation.setText(information);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        if(requestCode == 3){
            if(resultCode == RESULT_OK){
                tv_showInformation.setText(data.getStringExtra("information_Activity3"));
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
}

توضیح کد بالا:

ابتدا دو Button و یک TextView تعریف کرده و آن ها را findViewById می کنیم.سپس برای Button ها متد setonClickListener می نویسیم.

می خواهیم با کلیک روی دکمه ی btn_GoToActivity2، به Activity2 منتقل شویم، پس یک intent تعریف کرده و آن را startActivity می کنیم:

btn_GoToActivity2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(Intent_FinishActivity.this, Activity2.class);
        startActivity(i);
    }
});

می خواهیم با کلیک روی دکمه ی btn_GoToActivity3، به Activity3 منتقل شویم، اما چون قرار است از Activity3 با finish به این صفحه برگردیم و داده ای را منتقل کنیم بجای startActivity ، باید از startActivityForResult استفاده کنیم و علاوه بر intent به آن یک requestCode نیز بدهیم . با استفاده از requestCode  یک کد به اکتیویتی که می خواهیم منتقل شویم اختصاص می دهیم.

btn_GoToActivity3.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(Intent_FinishActivity.this, Activity3.class);
        startActivityForResult(i ,3);
    }
});

گرفتن داده از Activity2 و نمایش آن در MainActivity

داخل صفحه ی Activity2  با کلیک روی دکمه ی آن ، داده ای را گرفته و توسط intent به صفحه ی MainActivity انتقال دادیم. می خواهیم این داده را بگیریم و داخل TextView ست کنیم. برای این کار ابتدا یک متغیر از نوع داده ی خود تعریف کرده سپس عبارت getIntent().getStringExtra را نوشته و نام داده ی خود را به آن می دهیم. دقت کنید که این نام باید دقیقا همان نامی باشد که در Activity2  بکار بردیم.

توجه داشته باشید که در اینجا چون داده ی ما از نوع String بود از متد getStringExtra استفاده کردیم ، شما می توانید انواع مختلف داده ها را به اینصورت بگیرید.

String information = getIntent().getStringExtra("information_Activity2");

و در آخربعد از گرفتن داده، آن را برای TextView  ست می کنیم:

tv_showInformation.setText(information);

گرفتن داده از Activity3 و نمایش آن در MainActivity

داخل صفحه ی Activity3  با کلیک روی دکمه ی آن داده ای را گرفته و توسط finish به صفحه ی MainActivity انتقال دادیم. می خواهیم این داده را بگیریم و داخل TextView ست کنیم.

برای این کار ابتدا باید بیرون از onCreate متدی تعریف کنیم بنام onActivityResult. برای نوشتن این متد کافیست نام آن را نوشته و آن را ایمپورت کنیم.

داخل این متد ابتدا چک می کنیم که از کدام اکتیویتی برمی گردیم که این کار توسط requestCode انجام می شود.

داخل MainActivity برای انتقال به صفحه ی Activity3 از startActivityForResult استفاده کردیم و به آن یک requestCode دادیم .حالا باید داخل متد onActivityResult با if چک کنیم آیا requestCode با این requestCode که ما تعریف کرده بودیم برابر هست یا نه . اگر برابره چک کنیم آیا resultCode با RESULT_OK برابر هست یا نه. اگر برابره داده را گرفته و برای TextView ست کنیم.

در پارامتر های ورودی متد onActivityResult یک intent بنام data تعریف شده که برای گرفتن داده بجای نوشتن getIntent() همان data را می نویسیم.

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

    if(requestCode == 3){
        if(resultCode == RESULT_OK){
            tv_showInformation.setText(data.getStringExtra("information_Activity3"));
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

خروجی پروژه

با اجرا کردن پروژه ابتدا وارد صفحه ی زیر می شوید:

Author

مدیریت سایت

Leave a comment

نشانی ایمیل شما منتشر نخواهد شد.