[Android] 안드로이드 화면 전환 간 데이터 주고받기

Android/Android · 2020. 6. 7. 00:52
반응형

https://survivalcoding.com/p/android_basic

 

될 때까지 안드로이드

될 때까지 안드로이드에 수록된 예제의 라이브 코딩 해설

survivalcoding.com

위 서적을 참고하였습니다.

 

 

 

 저번 포스트에선 putExtra()와 getExtra()로만 가지고 화면간 데이터를 전송하는 프로그램을 만들어봤는데요, 이번엔 서로 다른 액티비들 간에 데이터를 서로 주고받는 프로그램을 만들어 보겠습니다.

 

 먼저 레이아웃을 두 개 준비해 보겠습니다.

 

 

activity_main.xml

<?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:orientation="vertical">

    <EditText
        android:id="@+id/edit_text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름"/>

    <EditText
        android:id="@+id/edit_text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="나이"/>

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="전송"/>

    <TextView
        android:id="@+id/txt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="결과"/>

</LinearLayout>

 

activity_second.xml

<?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"
    tools:context=".SecondActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="result"/>

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="전달"/>

</LinearLayout>

 

activity_main.xml

activity_second.xml

 이렇게 main.xml과 second.xml이 만들어진 모습을 볼 수 있습니다.

 

 

 그 다음 자바코드를 작성하러 가보겠습니다.

 

 

MainActivity.java

package hello.world.study;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import static android.provider.AlarmClock.EXTRA_MESSAGE;

public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_CODE = 1000;
    private EditText editText1, editText2;
    private Button button;
    private Intent intent;
    private TextView textView;

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

        editText1 = (EditText)findViewById(R.id.edit_text1);
        editText2 = (EditText)findViewById(R.id.edit_text2);
        textView = (TextView)findViewById(R.id.txt1);

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

        button = (Button)findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent.putExtra("name", editText1.getText().toString());
                intent.putExtra("age", editText2.getText().toString());
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
            String result = data.getStringExtra("result");
            textView.setText(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT);
        }
    }
}

 

SecondActivity.java

package hello.world.study;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView textView;

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

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        String age = intent.getStringExtra("age");

        textView = (TextView)findViewById(R.id.txt2);
        textView.setTextSize(30);
        textView.setText(name+ "\n"+ age);

        findViewById(R.id.btn2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.putExtra("result", textView.getText().toString());

        setResult(RESULT_OK, intent);
        finish();
    }
}

 

 이 두 액티비티의 실행 과정을 먼저 설명드리겠습니다.

 

1. EditText()값을 getText().toString()으로 받아와서 변수에 저장 후 putExtra()를 통해 데이터를 전달합니다. 여기서 startActivity(intent, REQUEST_CODE)를 호출하는 것을 볼 수 있는데요, 이는 SecondActivity를 실행하는 동시에 REQUEST_CODE라는 요청값을 넘겨준다는 뜻입니다. 나중에 SecondActivity에서 다시 값을 받을 때 REQUEST_CODE값도 같이 넘어오며, 어떤 요청의 결과인지를 구분지을 수 있습니다.

 

2. MainActivity에서 받아온 값을 getStringExtra()값으로 변수에 저장 후 다시 putExtra()로 값을 넘겨주고 setResult()에 있는 RESULT_OK와 결과에 대한 intent객체를 이 액티비티를 호출한 액티비티(MainActivity)로 돌려줄 수 있습니다. 여기서 RESULT_OK는 데이터를 넘기는데 성공을 했다는 뜻으로 사용됩니다. 마지막으로 finish()메소드로 종료하면 SecondActivity는 종료되고 MainActivity가 보이게 됩니다.

 

3. 이제 MainActivity의 onActivityResult()를 override를 해줍니다. 그리고 if()문을 사용하여 requestCode == REQUEST_CODE(1000)인지 확인하고, resultCode == RESULT_OK가 제대로 값이 넘어왔는지, 그리고 data가 널값이 아닌지를 체크해줍니다. 1번에서 말했듯이 REQUEST_CODE는 다시 값이 넘어옵니다.

 

MainActivity.java

SecondActivity.java

MainActivity.java

 

 사진을 보시는 것과 같이 제대로 나왔습니다.

 

 버튼클릭 이벤트를 두가지로 나눠서 구현을 해봤는데요, MainActivity는 Anonymus inner class로 구현을 한 번 해봤습니다. 이 외에도 다양한 클릭 이벤트에 대한 예가 있는데요, 다음에 한 번 정리해보도록 하겠습니다. 감사합니다.

반응형