안드로이드를 할 때 결과값이 어디서 날아오는지가 중요할때가 있다.
각 서브에서 날아온 값마다 다른 내용을 도출해야하므로, 어디서 참조해서 날아온 결과인지 알 수 없을 때가 있다. 이 때 사용하는 것이 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) 이메일 인증
'Android' 카테고리의 다른 글
안드로이드 스튜디오,JAVA] 액티비티 변경에 따른 스택관리 (0) | 2020.07.22 |
---|---|
안드로이드 스튜디오, JAVA]Material Design Navigation View에서, onNavigationItemSelected가 인식되지 않을 때 (0) | 2020.07.22 |
Android Studio, Java] 생명주기 (0) | 2020.07.21 |
Android Studio, java] 액티비티 변경하기, 데이터 이동하기 (0) | 2020.07.21 |
안드로이드 스튜디오,java]Bottom Navigation 구현 (0) | 2020.07.16 |