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