본문 바로가기
Front-end/Android (안드로이드 앱 개발)

Android Studio , Intent 로 객체 전달하기, Parcelable

by javapp 자바앱 2020. 7. 28.
728x90

세컨드 액티비티로 넘어갈때 인텐트로 값을 넘긴다.

 

<메인>

public class MainActivity extends AppCompatActivity {
    TextView text2;

    final int SECOND_ACTIVITY =1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text2 = findViewById(R.id.textView);
    }

    public void btnClicked(View view) //메인A -> 2A
    {
        Intent intent = new Intent(this, SecondActivity.class);

        TestClass t1 = new TestClass();
        t1.setData10(100);
        t1.setData20("문자열1");

        intent.putExtra("test1", t1);

        //startActivity(intent);
        startActivityForResult(intent,SECOND_ACTIVITY);             

       //다시 돌아왔을 때 onActivityResult 실행해서 SECOND_ACTIVITY 인지 확인후 값을 받는다.
    }

    @Override           //다시 돌아왔을 때 이 함수가 실행돼 처리된다.
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SECOND_ACTIVITY) {    //요청
            if (resultCode == RESULT_OK) {
                TestClass t2 = data.getParcelableExtra("test2");    //세컨드 액티비티에서 보낸값
                text2.setText(t2.getData10()+"\n");
                text2.append(t2.getData20());
            }
        }
    }
}

 

<세컨드 액티비티>

public class SecondActivity extends AppCompatActivity {
    TextView text1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        text1=(TextView) findViewById(R.id.textView);

        Intent intent = getIntent();
        //Creator 메서드를 호출해 반환받는 메서드 호출
        TestClass t1 = intent.getParcelableExtra("test1");  //이전 액티비티에서 넘긴 값이 key == test1

        text1.setText("t1의 데이터 "+ t1.getData10()+"\n");
        text1.append("t1스트링 "+ t1.getData20());
    }

    public void btnSAClicked(View view){ //세컨드에서 값을 보낼때
        Intent intent = new Intent();

        TestClass t2 = new TestClass();
        t2.setData10(200);
        t2.setData20("문자열2");

        intent.putExtra("test2",t2);
        setResult(RESULT_OK,intent);
        finish();
    }
}

 

엔티티클래스.java>


public class TestClass implements Parcelable        // Parcelable
{
    int data10;
    String data20;

    //새롭게 생성된 액티비티에서 이 객체를 추출해 낼때 호출      //중요
    public static final Creator<TestClass> CREATOR = new Creator<TestClass>() {
        @Override
        public TestClass createFromParcel(Parcel in) {
            TestClass t1 = new TestClass();
            t1.setData10(in.readInt());
            t1.setData20(in.readString());
            return t1;
        }

        @Override
        public TestClass[] newArray(int size) {
            return new TestClass[size];
        }
    };

    public int getData10() {
        return data10;
    }
    public void setData10(int data10) {
        this.data10 = data10;
    }
    public String getData20() {
        return data20;
    }
    public void setData20(String data20) {
        this.data20 = data20;
    }

    //객체를 intent에 담을때 자동으로 호출
    //Parcel 객체에 객체복원을 위해 필요한 정보 담기, 멤버 변수 모두 저장,(중요)
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(data10);
        dest.writeString(data20);
    }
    @Override
    public int describeContents() {
        return 0;
    }
}

 

댓글