엑티비티 간 데이터를 전달할수있다.
먼저 메인 엑티비티에서 intent의 putExtra로 데이터를 전달한다.
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("email",email);
intent.putExtra("name",name);
intent.putExtra("age",age);
intent.putExtra("hiddenData",hiddenData);
// 데이터만 전달하는 경우
startActivity(intent);
# 먼저 Intent 객체 생성하고 그 후에 putExtra를 사용해서 데이터를 넘겨준다.
# putExtra의 첫번째 파라미터는 넘겨주는 데이터의 키 값이며 두번째 파라미터로 데이터가 들어있는 변수를 지정해줬다.
정보를 받을 두번째 엑티비티에서 getIntent와 getExtra 형식의 코드로 데이터를 받자.
String email = getIntent().getStringExtra("email");
String name = getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age",0);
double hiddenData = getIntent().getDoubleExtra("hiddenData",0.0);
# 먼저 getIntent로 Intent를 가져온다
# 그리고 데이터 타입에 맞게 getStringExtra, getIntExtra, getDoubleExtra 등으로 메인에서 설정한 키 값을 불러 데이터를 가져온다.
# 숫자형식은 두번째 파라미터가 필요하며 가져올 값이 없을때 들고 올 수를 넣어준다.
이제 실행한 엑티비티로부터 데이터를 전달받는 코드를 메인에 작성한다.
startActivityForResult는 deprecated 되었다.
# deprecated는 안드로이드 버전이 바뀌어 이제 곧 사라질 예정이라는 뜻이다.
그래서 registerForActivityResult를 ActivityResultLauncher에 캐스팅하여 진행해야 한다.
// 내가 실행한 엑티비티 부터 데이터를 받아와서 처리하는 코드
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 0){
int age = result.getData().getIntExtra("age",0);
editAge.setText(""+age);
}
}
});
# registerForActivityResult의 첫번째 파라미터로는 deprecated된 startActivityForResult 를
# 두번째 파라미터에는 ActivityResultCallback를 넣는데 그러면 자동으로 오버라이드 된다.
# result에는 resultCode가 있으며 resultCode의 값으로 여러가지의 데이터타입을 구분해서 사용가능하다.
이제 두번째 엑티비티에서 버튼을 누르면 editText에서 입력한 데이터가 다시 메인 엑티비티로 갈수있도록 작성한다.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String ageStr = editAge.getText().toString().trim();
int age = Integer.valueOf(ageStr).intValue();
Intent intent = new Intent();
intent.putExtra("age",age);
setResult(0,intent);
finish();
}
});
# EditText에 있던 데이터를 getText와 toString으로 문자화 하여 가져온다.
# 문자화 된 데이터를 valueOf와 intValue를 통해 다시 정수로 바꾼다.
# 이제 Intent를 객체생성하고 putExtra로 전닿한다.
# 여기서 setResult로 result를 하고 finish로 창이 닫히도록 한다.
메인에서는 위에서 변수 설정한 받아오는 코드 startActivityResult로 launch해서 두번째 엑티비티를 열수 있도록 한다.
startActivityResult.launch(intent);
사용된 앱:
# 이메일, 이름, 나이 데이터를 주고 받을수있는 테스트앱
메인 엑티비티
public class MainActivity extends AppCompatActivity {
EditText editEmail;
EditText editName;
EditText editAge;
Button button;
// 내가 실행한 엑티비티 부터 데이터를 받아와서 처리하는 코드
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
// result에는 resultCode가 있다.
// resultCode의 값으로 여러가지 구분해서 사용가능
if (result.getResultCode() == 0){
int age = result.getData().getIntExtra("age",0);
editAge.setText(""+age);
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editEmail = findViewById(R.id.editEmail);
editName = findViewById(R.id.editName);
editAge = findViewById(R.id.editAge);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = editEmail.getText().toString().trim();
String name = editName.getText().toString().trim();
String ageStr = editAge.getText().toString().trim();
int age = Integer.valueOf(ageStr).intValue();
double hiddenData = 3.1414;
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("email",email);
intent.putExtra("name",name);
intent.putExtra("age",age);
intent.putExtra("hiddenData",hiddenData);
// 데이터만 전달하는 경우
// startActivity(intent);
// 다시 실행한 엑티비티로 부터 데이터를 전달받는 경우 (위에서 캐스팅)
// startActivityForResult(intent)
startActivityResult.launch(intent);
}
});
}
}
세컨드 엑티비티
public class SecondActivity extends AppCompatActivity {
TextView txtEmail;
TextView txtName;
EditText editAge;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 메인에서 온 데이터를 받아준다.
// Intent를 가져온다.
String email = getIntent().getStringExtra("email");
String name = getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age",0);
double hiddenData = getIntent().getDoubleExtra("hiddenData",0.0);
txtEmail = findViewById(R.id.txtEmail);
txtName = findViewById(R.id.txtName);
editAge = findViewById(R.id.editAge);
button = findViewById(R.id.button);
// 데이터를 화면에 세팅
txtEmail.setText(email);
txtName.setText(name);
editAge.setText(age+"");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String ageStr = editAge.getText().toString().trim();
int age = Integer.valueOf(ageStr).intValue();
Intent intent = new Intent();
intent.putExtra("age",age);
setResult(0,intent);
finish();
}
});
}
}
'Android' 카테고리의 다른 글
| [Android] SQLite3 데이터 활용: CRUD 작업, SQLiteDatabase, do, while (0) | 2022.07.14 |
|---|---|
| [Android] 데이터 저장: SharedPreference (0) | 2022.07.13 |
| [Android] 이메일 유효성 검사하는 Pattern 코드 (0) | 2022.07.13 |
| [Android] TODO 활용 (0) | 2022.07.13 |
| [Android] 엑티비티(Activity): Intent (0) | 2022.07.13 |
댓글