오늘이라도
[Android] 10. intent로 Activity 간에 데이터 주고받기, DTO 활용 / Dialog 띄우기 본문
취업성공패키지 SW 개발자 교육/Android
[Android] 10. intent로 Activity 간에 데이터 주고받기, DTO 활용 / Dialog 띄우기
upcake_ 2020. 5. 19. 09:33반응형
https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- intent로 Activity 간에 데이터 주고받기, DTO 활용 -
▼activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvMain"
android:layout_width="305dp"
android:layout_height="173dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="54dp"
android:layout_marginLeft="54dp"
android:layout_marginTop="209dp"
android:text="TextView"
android:textSize="24dp" />
<Button
android:id="@+id/btnMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="101dp"
android:text="새 화면 띄우기"
android:textSize="24dp" />
</RelativeLayout>
▼MainActivity.java
package com.example.my10_intentresult;
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.TextView;
public class MainActivity extends AppCompatActivity {
//리퀘스트 코드 설정
public final int REQUEST_CODE = 1004;
//변수 선언
Button btnMain;
TextView tvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//변수 초기화
tvMain = findViewById(R.id.tvMain);
btnMain = findViewById(R.id.btnMain);
//기능 추가
btnMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//데이터 보내기
//DTO 만들기
PersonDTO person1 = new PersonDTO("CSS", 3333);
//인텐트 설정 : ① 컨텍스트 보내기 ② 받는 액티비티.class
Intent intent = new Intent(MainActivity.this, Sub1Activity.class);
intent.putExtra("id", "KIM");
intent.putExtra("pw", 1234);
intent.putExtra("person1", person1);
//리퀘스트 설정
startActivityForResult(intent, REQUEST_CODE);
}
});
}
//데이터 받기
//방법 ① : onActivityResult를 만들어서 받기
//우클릭 - Generate - Override Methods - onActivityResult
//onAct 자동 완성 - onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == REQUEST_CODE) { //requestCode가 1004이고
if(data != null) { //data가 null이 아니면
String key = data.getStringExtra("key");
tvMain.setText(key);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
▼PersonDTO.java
package com.example.my10_intentresult;
import java.io.Serializable;
public class PersonDTO implements Serializable {
String id;
int pw;
//생성자
//우클릭 - Generate - Constructor
public PersonDTO() { }
public PersonDTO(String id, int pw) {
this.id = id;
this.pw = pw;
}
//Getter & Setter
//우클릭 - Generate - Getter and Setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getPw() {
return pw;
}
public void setPw(int pw) {
this.pw = pw;
}
}
▼activity_sub1.xml
<?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"
tools:context=".Sub1Activity" >
<Button
android:id="@+id/btnSub1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="101dp"
android:layout_marginEnd="105dp"
android:layout_marginRight="105dp"
android:text="메인으로 돌아가기"
android:textSize="24dp" />
<TextView
android:id="@+id/tvSub1"
android:layout_width="294dp"
android:layout_height="200dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="56dp"
android:layout_marginLeft="56dp"
android:layout_marginTop="217dp"
android:text="TextView"
android:textSize="24dp" />
</RelativeLayout>
▼Sub1Activity.java
package com.example.my10_intentresult;
import androidx.appcompat.app.AppCompatActivity;
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 Sub1Activity extends AppCompatActivity {
private static final String TAG = "Sub1Activity";
//변수 선언
Button btnSub1;
TextView tvSub1;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub1);
//변수 초기화
tvSub1 = findViewById(R.id.tvSub1);
btnSub1 = findViewById(R.id.btnSub1);
//데이터 받는 곳
intent = getIntent();
if(intent != null) {
String id = intent.getStringExtra("id");
int pw = intent.getIntExtra("pw", 0); // int형은 null 값이 넘어올 경우를 대비해서 기본값을 줘야한다.
PersonDTO person1 = (PersonDTO) intent.getSerializableExtra("person1");
// Object 타입으로 리턴하기 때문에 DTO 타입으로 캐스팅해준다.
//Log.d() : Logcat에 출력하는 메서드
Log.d(TAG, "onCreate id: " + id);
Log.d(TAG, "onCreate pw: " + pw);
// String이 쓰여야하므로 pw(int) 단독으로 쓰면 에러가 난다.
// 문자를 먼저 쓸 경우 자동으로 String으로 캐스팅이 된다.
// 단독으로 사용해야 할 때는 String.valueOf() 메서드를 사용한다.
//setText() : textView에 메시지 출력하는 메서드
tvSub1.setText("받은 값은 : " + id + ", " + pw);
//append() : 마지막 위치에 문자열을 붙이는 메서드
tvSub1.append("\nperson1 : " + person1.getId() + ", " + person1.getPw());
}
//메인에 데이터 보내기
btnSub1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent reIntent = new Intent();
reIntent.putExtra("key", tvSub1.getText().toString() + " ㅋㅋㅋ");
setResult(RESULT_OK, reIntent);
finish();
}
});
}
}
- Dialog 띄우기 -
▼activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvAlarm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="1dp"
android:layout_marginLeft="0sp"
android:layout_marginTop="0sp"
android:gravity="center"
android:text="버튼을 누르면 대화 상자가 뜹니다!"
android:textSize="24sp" />
<Button
android:id="@+id/btnOpen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvAlarm"
android:layout_centerHorizontal="true"
android:layout_marginTop="95dp"
android:text="대화 상자 열림"
android:textSize="24sp" />
</RelativeLayout>
▼MainActivity.java
package com.example.my11_dialog;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
//변수 선언
Button btnOpen;
TextView tvAlarm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//변수 초기화
tvAlarm = findViewById(R.id.tvAlarm);
btnOpen = findViewById(R.id.btnOpen);
//버튼에 기능 추가
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showMessage();
}
});
}
//메서드는 onCreate 밖에 만든다.
private void showMessage() {
//AldertDialog.Builder(컨텍스트)
//컨텍스트 : this, getApplicationContext() 등
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("안내");
builder.setMessage("종료하시겠습니까?");
builder.setIcon(android.R.drawable.ic_dialog_alert);
//DialogInterface의 OnClickListener를 사용한다.
builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String message = "'예' 버튼이 눌렸습니다. : " + which; //which : -1
tvAlarm.setText(message);
}
});
builder.setNegativeButton("아니오", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String message = "'아니오' 버튼이 눌렸습니다. : " + which; //which : -2
tvAlarm.setText(message);
}
});
builder.setNeutralButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String message = "'취소' 버튼이 눌렸습니다. : " + which; //which : -3
tvAlarm.setText(message);
}
});
//dialog 창을 띄운다.
AlertDialog dialog = builder.create();
dialog.show();
}
}
반응형
'취업성공패키지 SW 개발자 교육 > Android' 카테고리의 다른 글
[Android] 12. 서비스 (0) | 2020.05.21 |
---|---|
[Android] 11. Life Cycle : onCreate, onStart, onResume, onPause, onStop, onDestroy, 데이터 저장, 불러오기 (0) | 2020.05.20 |
[Android] 9. Layout Inflate (0) | 2020.05.18 |
[Android] 8. Drawable Resource XML 작성 : gradient, shape, drawable, layer-list (0) | 2020.05.15 |
[Android] 7. ScrollView ① : 가로, 세로 스크롤/ScrollView ② : 가로 길게 스크롤/레이아웃 복습 (0) | 2020.05.14 |