내가 만든 class를 전송(Serializable 이용)
위 강의에 이어서 진행합니다.
지난 시간까지 기본 데이터타입(primitive data type)을 Intent를 통하여 보내는 방법을 알아보았습니다. 이번시간에는 Serializable을 이용한 Class를 Intent를 통해 보내는방법을 알아보겠습니다.
기본 데이터 타입이 아닌 class를 통해 Intent를 보내면 어떤점이 좋을까요?
한꺼번에 클래스에 넣어서 보낼수있기때문에 훨씬더 간편하고 수정사항 등이 발생했을때 더 손쉽게 수정할수 있을것이라고 저는 생각되는데요
지난 시간에 했던 프로젝트에 이어서 진행해보도록하겠습니다.
지난 시간 까지 위와 같은 화면을 구성했었는데요 버튼을 하나 더 생성하여 activity3_serializable 이라는 Text를 입력하도록합시다. id는 activity3_btn 으로 하도록하겠습니다.
Activiy3이라는 새로운 activity를 만들어줍니다(새 엑티비티 만드는법은 이전 강좌들에서 진행했기때문에 설명하지 않겠습니다.)
아래의 강좌를 따라하시면 새 activity를 만드실수 있습니다.
Activity3 을 만드셨으면 MainActivity로 돌아가 button객체를 추가해주고 Activity3을 호출하는 코드를 작성해봅시다.(이것또한 위의 강좌에 나와있어 저는 코드만 적도록하겠습니다.)
public class MainActivity extends AppCompatActivity {
TextView num_textView;
TextView url_textView;
Button activity2_btn;
//추가됨
Button activity3_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
num_textView = (TextView)findViewById(R.id.num_textView);
url_textView = (TextView)findViewById(R.id.url_textView);
activity2_btn = (Button)findViewById(R.id.activity2_btn);
//추가됨
activity3_btn = (Button)findViewById(R.id.activity3_btn);
num_textView.setOnClickListener(mClickListener);
url_textView.setOnClickListener(mClickListener);
activity2_btn.setOnClickListener(mClickListener);
//추가됨
activity3_btn.setOnClickListener(mClickListener);
}
View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.num_textView :
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+num_textView.getText().toString()));
startActivity(intent);
break;
case R.id.url_textView :
Intent intent2 = new Intent(Intent.ACTION_VIEW, Uri.parse(url_textView.getText().toString()));
startActivity(intent2);
break;
case R.id.activity2_btn :
Intent intent3 = new Intent(MainActivity.this,Main2Activity.class);
intent3.putExtra("tel", num_textView.getText().toString());
intent3.putExtra("cnum", 1234);
startActivityForResult(intent3,1111);
break;
//추가됨
case R.id.activity3_btn :
Intent intent4 = new Intent(MainActivity.this,Activity3.class);
startActivity(intent4);
break;
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1111){
if(resultCode==1234) {
Log.v("MainActivity", "Main2Acitiy result : " + data.getStringExtra("result"));
}
}
}
}
이제 Activity3을 호출하는 코드는 작성이되었습니다. 이번강좌에서는 Intent를 통해 Class를 전송할것이기 때문에 MyData라는 java파일을 만들도록합시다. 이 MyData에는 전화번호(tel) 와 url을 필드를 만들고 getter와 setter, constructor을 모두만들어주도록합시다.
(이 새클래스 만드는 방법은 ListView강의의 Item만드는 부분에 나와있으므로 기억나지 않으면 참고하도록합시다.)
빠르게 배우는 안드로이드 — 리스트뷰(ListView) -1오늘은 어플리케이션을 만들때 가장 유용하게 쓰이는 리스트뷰에 대해서
알아보겠습니다.
MyData클래스의 코드입니다.
public class MyData {
private String tel;
private String url;
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public MyData(String tel, String url) {
this.tel = tel;
this.url = url;
}
}
이 상태에서
public class MyData implements Serializable {
로 Serializable interface를 추가해주고 그 위에
@SuppressWarnings("serial")
public class MyData implements Serializable {
}
annotation을 추가해줍니다.
원래는
private static final long serialVersionUID = 4220461820168818967L; 등으로 UId를 generate해서 사용해야되나 studio에는 기본 제공되는 generate가 없기때문에 위의 annotaion을 추가하면됩니다.
이제 기본 설정을 끝났습니다. MainActivity로 돌아가 intent에 우리의 클래스를 추가해주도록합시다.
클래스를 넘겨주기위해서 임시로 myData객체를 생성하였고
Bundle bundle = new Bundle();
bundle.putSerializable(“key”,객체);
intent4.putExtras(bundle);
의 형식으로 클래스를 intent에 저장하였습니다.
case R.id.activity3_btn :
MyData myData = new MyData(num_textView.getText().toString(),url_textView.getText().toString());
Intent intent4 = new Intent(MainActivity.this,Activity3.class);
Bundle bundle = new Bundle();
bundle.putSerializable("myData",myData);
intent4.putExtras(bundle);
startActivity(intent4);
break;
이제 새로만든 Activity3에서 데이터를 받는 코드를 만들어봅시다.
public class Activity3 extends AppCompatActivity {
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_3);
intent = getIntent();
MyData myData = (MyData)intent.getSerializableExtra("myData");
Log.v("Test", "tel : "+myData.getTel() + " url : "+myData.getUrl());
}
}
기존의 intent와 받는 방법은 비슷한것을 알수있습니다.
다른점은 getInteger등이 아니라 getSerializableExtra(“key”)후 형변환(캐스팅) 을 해준다는것이 약간다를뿐입니다. 이제 실행을하여 결과를 확인해봅시다.
다음과 같이 우리가 원하는 결과를 받는것을 알수있습니다.