안드로이드 액티비티에 데이터 전달하기. (How to transfer data to an Activity)

2016. 9. 1. 16:51


1. Activity에 데이터 표시.

새로운 Activity를 화면에 표시하는 목적은 여러가지가 있지만, 그 중에 많은 비중을 차지하는 것이 바로 사용자가 선택한 아이템의 상세 정보를 보여주는 것입니다. ListView에 아이템(예. 연락처 이름) 리스트를 표시하고, 사용자가 하나의 아이템을 선택하면 아이템의 상세 정보(예. 이름, 전화번호, 주소 등)를 새로운 Activity로 전달하여 사용자에게 표시하는 경우를 예로 들 수 있죠.


[안드로이드 액티비티]에서, Activity를 실행하기 위해서는 Intent를 사용해야 한다고 설명했습니다. 실행하고자 하는 Activity 클래스를 Intent 객체에 지정한 다음, startActivity() 함수를 호출하는 간단한 코드를 소개했었죠.


    Intent intent = new Intent(this, A.class) ;
    startActivity(intent) ;


여기서 설명하고자 하는, Activity에 데이터를 전달하는 방법 또한 Intent를 사용하도록 만들어져 있습니다. Intent에, "실행할 Activity 정보"와 더불어 "추가적인(Extra) 데이터"를 실어 전달하는 것이죠.


1.1 Intent를 통해 데이터 전달하기.

Intent를 통해 전달하는 "추가적인(Extra) 데이터"는, "실행할 Activity 정보"와 다르게 필수적인 사항이 아닙니다. Activity의 동작에 따라 Activity의 외부로부터 전달되는 데이터가 필요하지 않는 경우도 있기 때문이죠.


그러므로 Intent의 입장에서 보자면 데이터는 필수 항목이 아닌 추가적인(Extra) 내용이며, 이를 처리하기 위해 putExtra(), getXxxExtra() 라는 형식의 이름을 가진 함수를 제공하고 있습니다. 함수의 이름에서 유추할 수 있듯이 putExtra()는 데이터를 보내기 위해 사용하는 함수이고, getXxxExtra() 형식의 함수는 데이터를 받는 Activity에서 사용하는 함수입니다.


데이터를 보내는 함수는 putExtra() 함수로 이름이 정해져 있는데, 받는 곳에서 사용하는 함수는 getXxxExtra()와 같이 "Xxx"가 붙어 있습니다. 이 "Xxx"는 Boolean, Int, String 등과 같은 타입을 지칭합니다.
Intent를 통해 보내고자 하는 데이터의 타입이 여러 종류라도 putExtra() 함수는 파라미터만 달리하여 함수를 overload할 수 있지만 받는 곳에서 호출하는 get 함수는 어떤 타입으로 리턴해야 할지 자동으로 알 수 없죠. 그래서 받는 쪽에서는 사용하고자 하는 타입에 따라 리턴받아 쓸 수 있도록 getBooleanExtra(), getIntExtra(), getStringExtra() 등의 함수로 나누어 제공하고 있습니다.


아래 그림은 Intent를 통해 데이터 전달이 이루어지는 과정을 그림으로 표현한 것입니다.

인텐트를 통한 데이터 전달.


데이터를 전달하기 위한 함수의 파라미터를 보면 단순히 데이터 값(val)만 지정하지 않고, 키(key)와 값(val)으로 구성된 한 쌍의 데이터를 같이 전달하는 것을 확인할 수 있습니다. 이는 Intent로 전달된 여러 종류의 데이터를 수신 측 Activity에서 식별할 수 있도록 해주기 위함입니다.

인텐트 데이터 키,값 (key,value)


이제, 예제 코드를 통해 Activity에 데이터를 전달하는 방법에 대해 알아보겠습니다.

2. Activity에 데이터 전달하기.

2.1 예제 구성도

예제 화면의 구성도는 아래와 같습니다.

액티비티 데이터 전달하기 예제 화면 구성도


2.2 MainActivity에 표시될 Layout 구성.

예제 화면 구성도에서 설계한 내용대로 MainActivity에 표시될 Layout을 구성합니다.

[STEP-1] "content_main.xml" - MainActivity에 표시될 Layout 구성.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.recipes4dev.examples.activityexample2.MainActivity"
    tools:showIn="@layout/activity_main">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:stretchColumns="1">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="No" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextNo"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Name" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextName"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Phone" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextPhone"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Over20" />

            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:id="@+id/checkBoxOver20"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_span="3"
                android:textSize="24dp"
                android:text="Start Activity"
                android:id="@+id/buttonStartActivity" />

        </TableRow>
    </TableLayout>

</RelativeLayout>

2.3 연락처 Activity 추가 및 Layout 구성.

이제 MainActivity에서 입력된 연락처 정보를 전달받아 화면에 표시할 연락처 Activity를 추가한 다음, Layout을 구성하겠습니다.


먼저 Activity를 추가합니다. Activity를 추가하는 방법은 [안드로이드 액티비티 실행하기 - 3.2 Activity 추가를 위한 쉬운 방법]의 내용을 참고하시기 바랍니다. 여기서는 "Basic Activity"를 선택하였습니다.

[STEP-2.1] ContactActivity 추가.

액티비티 추가 화면


다음, 예제 화면 구성도에 따라 ContactActivity에 표시될 Layout을 구성합니다. (예제에서는 "activity_contact.xml"과 함께 추가된 "content_contact.xml"에 Layout을 구성하지만, 안드로이드 스튜디오 프로젝트에 따라 "activity_contact.xml"만 생성되는 경우도 있음을 주의하세요.)

[STEP-2.2] "content_contact.xml" - ContactActivity를 위한 Layout 작성.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.recipes4dev.examples.activityexample2.ContactActivity"
    tools:showIn="@layout/activity_contact">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="center"
        android:background="#FFE0E0"
        android:layout_marginBottom="8dp"
        android:id="@+id/textViewNo"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="center"
        android:background="#E0FFE0"
        android:layout_marginBottom="8dp"
        android:id="@+id/textViewName"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="center"
        android:background="#E0E0FF"
        android:layout_marginBottom="8dp"
        android:id="@+id/textViewPhone"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="center"
        android:background="#FFE0FF"
        android:id="@+id/textViewOver20"/>

</LinearLayout>

2.4 연락처 Activity 실행하기

연락처 Activity(ContactActivity)를 추가했으니, MainActivity의 "Start Activity" 버튼을 클릭하면 연락처 Activity(ContactActivity)를 실행하는 코드를 작성하겠습니다.

[STEP-3.1] "MainActivity.java" - "Start Activity" Button 클릭 이벤트 추가.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // ... 코드 계속

        Button buttonStartActivity = (Button) findViewById(R.id.buttonStartActivity) ;
        buttonStartActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO : create intent and start activity.

            }
        });
    }
}

Intent를 통해 데이터를 전달하기 위해 각 View 위젯으로부터 입력 값을 가져옵니다. 그 다음 putExtra() 함수를 사용하여 Intent에 데이터를 추가하고 startActivity() 함수를 호출하여 ContactActivity를 실행합니다.

[STEP-3.2] "MainActivity.java" - "Start Activity" Button 클릭 이벤트 추가.
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, ContactActivity.class) ;

        // No 입력 값을 int 값으로 변환하여 전달.
        EditText editTextNo = (EditText) findViewById(R.id.editTextNo) ;
        String strNo = editTextNo.getText().toString() ;
        if (!strNo.isEmpty() && strNo.matches("^[0-9]*$")) { // check numbers by RegEx.
            intent.putExtra("contact_no", Integer.parseInt(strNo)) ;
        } else {
            intent.putExtra("contact_no", 0) ;
        }

        // Name 입력 값을 String 값으로 그대로 전달.
        EditText editTextName = (EditText) findViewById(R.id.editTextName) ;
        intent.putExtra("contact_name", editTextName.getText().toString()) ;

        // Phone 입력 값을 String 값으로 그대로 전달.
        EditText editTextPhone = (EditText) findViewById(R.id.editTextPhone) ;
        intent.putExtra("contact_phone", editTextPhone.getText().toString()) ;

        // Over20 값을 boolean 값으로 전달.
        CheckBox checkBoxOver20 = (CheckBox) findViewById(R.id.checkBoxOver20) ;
        intent.putExtra("contact_over20", checkBoxOver20.isChecked()) ;

        startActivity(intent) ;
    }

위의 코드에서 putExtra() 함수를 통해 전달한 데이터는 다음 단계에서 각 타입별 getXxxExtra() 함수를 사용하여 가져올 수 있습니다.

put Extra and get Extra



2.5 연락처 Activity에서 전달받은 데이터 표시

연락처 Activity(ContactActivity)를 실행하는 것까지 작성하였으므로, 이제 전달받은 연락처 데이터를 연락처 Activity(ContactActivity)에서 표시하는 코드를 작성하겠습니다.

[STEP-4] "ContactActivity.java" - onCreate() 함수에서 Intent로 전달된 데이터 가져와서 표시.
public class ContactActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // ... 코드 계속.

        // Intent 가져오기.
        Intent intent = getIntent() ;

        // No 값을 int 타입에서 String 타입으로 변환하여 표시.
        TextView textViewNo = (TextView) findViewById(R.id.textViewNo) ;
        int no = intent.getIntExtra("contact_no", 0) ;
        textViewNo.setText(Integer.toString(no)) ;

        // Name 값을 String 타입 그대로 표시.
        TextView textViewName = (TextView) findViewById(R.id.textViewName) ;
        String name = intent.getStringExtra("contact_name") ;
        if (name != null)
            textViewName.setText(name) ;

        // Phone 값을 String 타입 그대로 표시.
        TextView textViewPhone = (TextView) findViewById(R.id.textViewPhone) ;
        String phone = intent.getStringExtra("contact_phone") ;
        if (phone != null)
            textViewPhone.setText(phone) ;

        // Over 20 값을 boolean 타입 그대로 검사하여 표시.
        TextView textViewOver20 = (TextView) findViewById(R.id.textViewOver20) ;
        boolean over20 = intent.getBooleanExtra("contact_over20", false) ;
        if (over20)
            textViewOver20.setText("Over 20") ;
        else
            textViewOver20.setText("Not over 20") ;
    }
}

3. 예제 실행 화면.

예제를 작성하고 실행하면 아래와 같이 MainActivity의 화면이 나타나고, 입력 필드에 값을 입력하고 "Start Activity" 버튼을 선택하면 ContactActivity에 입력한 데이터가 표시되는 것을 확인할 수 있습니다.

액티비티 데이터 전달하기 실행 화면


ContactActivity가 표시된 다음, "Back" 버튼을 누르면 MainActivity로 다시 전환됩니다.

4. 참고

.END.


ANDROID 프로그래밍/ACTIVITY