Androidの画面遷移時にIntentでDTOを受け渡す方法
Android開発でDTO(Data Transfer Object)をIntentで受け渡す方法についてご紹介します。
結論から言うと、DTOのクラスで「Serializableインタフェース」を実装することで可能になります。
また、「Serializableインタフェース」を実装したDTOをIntentに格納する時は、Intentクラスの「putExtra」メソッドを使用し、DTOをIntentから取得する時は、Intentクラスの「getSerializableExtra」メソッドを使用します。
「Serializableインタフェース」を実装していないDTOをIntentクラスの「putExtra」メソッドで格納しようとするとコンパイルエラーとなります。<コード上のポイント>
◆DTOクラス
public class SampleDto implements Serializable{ //必要な変数 //変数のgetter/setter }
クラス名の後に「implements Serializable」を記述します。
◆遷移元画面のActivity
//DTOのインスタンス化 SampleDto sampleDto = new SampleDto(); //DTOに値を格納する sampleDto.setZzz01(zzz01に格納する値); sampleDto.setZzz02(zzz02に格納する値); sampleDto.setZzz03(zzz03に格納する値); //インテントのインスタンス化 Intent intent = new Intent(this, 遷移先Activity.class); //DTOの格納 intent.putExtra("キーワード", sampleDto); startActivity(intent);
Intentの「putExtra」メソッドでDTOを格納します。
◆遷移先画面のActivity
Intent intent = getIntent();
SampleDto sampleDto =
(SampleDto)intent.getSerializableExtra("キーワード");
Intentの「getSerializableExtra」メソッドでDTOを取得します。その際、DTOのクラスにキャストしてやります。<サンプル実装>
遷移元画面で「id」「氏名」「電話番号」を入力し、遷移先画面で入力内容を確認するアプリの実装例です。
◆MemberDto(DTOのクラス)
public class MemberDto implements Serializable{ private int id; private String name; private String tel; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
◆FirstActivity(遷移元画面のActivity)
public class FirstActivity extends Activity implements OnClickListener{ private EditText id, name, tel; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first); id = (EditText)findViewById(R.id.txt_id); name = (EditText)findViewById(R.id.txt_name); tel = (EditText)findViewById(R.id.txt_tel); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(this); } @Override public void onClick(View v) { //DTOのインスタンス化 MemberDto memberDto = new MemberDto(); //DTOに画面上の値を格納する memberDto.setId(Integer.parseInt(id.getText().toString())); memberDto.setName(name.getText().toString()); memberDto.setTel(tel.getText().toString()); //インテントのインスタンス化 Intent intent = new Intent(this, SecondActivity.class); //DTOの格納 intent.putExtra("MemberData", memberDto); startActivity(intent); } }
◆SecondActivity(遷移先画面のActivity)
public class SecondActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); Intent intent = getIntent(); //DTOの取得 MemberDto memberDto = (MemberDto)intent.getSerializableExtra("MemberData"); //取得したDTOの値を画面に設定 TextView id = (TextView)findViewById(R.id.lbl_id); id.setText(String.valueOf(memberDto.getId())); TextView name = (TextView)findViewById(R.id.lbl_name); name.setText(memberDto.getName()); TextView tel = (TextView)findViewById(R.id.lbl_tel); tel.setText(memberDto.getTel()); } }
執筆者:中の人A