본문 바로가기
Android

Android Studio, JAVA] Result

by 김마리님 2020. 7. 21.

안드로이드를 할 때 결과값이 어디서 날아오는지가 중요할때가 있다.

각 서브에서 날아온 값마다 다른 내용을 도출해야하므로, 어디서 참조해서 날아온 결과인지 알 수 없을 때가 있다. 이 때 사용하는 것이 Result이다.

 

바로 예시를 보자.

간단하게 메인에는 받아온 결과를 출력하고, 두 SubActivity에서는 각 이메일과 숫자값을 입력 받는다.

 

화면 디자인 코드

더보기

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <TextView
        android:id="@+id/tv_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="148dp"
        android:text="Name"
        app:layout_constraintBottom_toTopOf="@+id/btn_num"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="인증번호 받기"
        app:layout_constraintBottom_toTopOf="@+id/tv_email"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_num"
        app:layout_constraintVertical_bias="0.155" />

    <Button
        android:id="@+id/btn_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:layout_marginBottom="100dp"
        android:text="이메일 인증 받기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_email"
        app:layout_constraintVertical_bias="1.0" />

    <TextView
        android:id="@+id/tv_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="172dp"
        android:text="Name"
        app:layout_constraintBottom_toTopOf="@+id/btn_email"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_num" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

-activity_sub.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".SubActivity">

    <EditText
        android:id="@+id/et_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintBottom_toTopOf="@+id/btn_num"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:text="인증 완료"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_num"
        app:layout_constraintVertical_bias="0.236"
        tools:ignore="UnknownIdInLayout" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

-activity_sub2.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".Sub2Activity">

    <EditText
        android:id="@+id/et_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintBottom_toTopOf="@+id/btn_email"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="인증 완료"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_email" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

이제 본격적인 자바 코드를 보자.

 

- MainActivity.java

package com.mary.lifecycleex2;

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

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    
    private Context mContext=MainActivity.this;
    private Button btnNum, btnEmail;
    private TextView tvNum, tvEmail;

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

        btnNum=findViewById(R.id.btn_num);
        btnEmail=findViewById(R.id.btn_email);
        tvNum=findViewById(R.id.tv_num);
        tvEmail=findViewById(R.id.tv_email);

        btnNum.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(mContext,SubActivity.class);

                //startActivity(intent) : 그냥 이동
                startActivityForResult(intent,1);
            }
        });

        btnEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(mContext,Sub2Activity.class);

                startActivityForResult(intent,1);
            }
        });
    }
    
    //콜백함수 (다른 화면이 꺼질 때 호출)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: 콜백");

        if(requestCode==1){
            if(resultCode==10){
                tvNum.setText(data.getStringExtra("number"));
            }else if(resultCode==20){
                tvEmail.setText(data.getStringExtra("email"));
            }
        }
    }
}

 

먼저 화면의 두 버튼을 클릭하면 다른 액티비티로 넘어가는 작업은 이벤트 리스너로 처리한다. 

이 때, 화면을 시작할때 startActivity가 아닌 startActivityForResult 함수로 결과를 처리해야하는데, 이 함수를 걸어두면 호출받은 액티비티가 result를 설정하고 종료했을 때, result 값을 이 화면으로 콜백받을 수 있기 때문이다.

 

이제 이 result를 만들어보자(SubActiviry1과 2가 같기 때문에 하나만 코드를 적는다.).

 

- SubActivity.java

package com.mary.lifecycleex2;

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;

public class SubActivity extends AppCompatActivity {

    private Button btnNum;
    private EditText etNum;

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

        btnNum=findViewById(R.id.btn_num);
        etNum=findViewById(R.id.et_num);

        btnNum.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();

                intent.putExtra("number",etNum.getText().toString());

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

(혹시 모르니까 이메일도)

더보기

- Sub2Activity.java

package com.mary.lifecycleex2;

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;

public class Sub2Activity extends AppCompatActivity {

    private EditText etEmail;
    private Button btnEmail;

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

        etEmail=findViewById(R.id.et_email);
        btnEmail=findViewById(R.id.btn_email);

        btnEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("email", etEmail.getText().toString());
                setResult(20,intent);
                finish();
            }
        });
    }
}

 

 

이전 글에서 얘기한 적이 있는데 짐(인증번호)을 싣고가는 트럭이 필요하고, 이 트럭이 intent이다. 따라서 새 트럭(intent)를 만들어준다. 그리고 그 트럭에 putExtra를 통해 key-value 의 형태로 값을 넣는다.

 

setResult(resultCode,value) 중 value는 내가 싣고 갈 값, 그리고 resultCode는 내가 이 값을 정상응답 했는지, 혹은 해킹당해서 다른 방식으로 값을 도출당했는지를 인증하는 위치이다. 따라서, 협업시 약속한 코드를 적어야 하며, 이 코드를 받아서 MainActivity에서 콜백을 지정하게 된다. 여기서는 번호 인증은 10, 이메일 인증에는 20을 지정했다.

 

콜백 함수에서는 먼저 내가 올바르게 요청했는가(requestCode), 올바른 인증결과인가(resultCode)를 if문으로 분기해 두 코드가 일치한다면 그 값을 화면에 출력한다. 

 

결과 :

 

1) 인증번호 인증

 

2) 이메일 인증

반응형