오늘이라도

[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();
    }
}
반응형