コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Androidアプリ入門 No.64 Intent アクションでデータを受け取る オブジェクトの受け渡し

アクションでデータを受け取る

オブジェクトの受け渡し

明示的なIntentでオブジェクトを受け渡すときにはSerializableを実装したオブジェクトを受け渡すことができる。その受け渡しの例を確認する。IntentTest2を変更して動作を確認する。まず、実際にデータを受け渡すSerializableを実装したクラスを作成する。単純にintとStringのデータを保持するクラスである。

package sample.dto;

import java.io.Serializable;

public class TestDto implements Serializable {
    private static final long serialVersionUID = 1L;

    private int intData;
    private String stringData;

    public int getIntData() {
        return intData;
    }

    public void setIntData(int intData) {
        this.intData = intData;
    }

    public String getStringData() {
        return stringData;
    }

    public void setStringData(String stringData) {
        this.stringData = stringData;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("intData=").append(intData);
        sb.append(" stringData=").append(stringData);

        return sb.toString();
    }
}

呼び出されるActivityのレイアウトmain2.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" />
</LinearLayout>

受け渡されるクラスの実装はSubActivity.javaとし、以下のようにする。getSrializableしたオブジェクトをTestDtoにキャストして、その内容をTextViewに表示する。

package sample.it2;

import sample.dto.TestDto;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SubActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);

        TextView textView = (TextView) findViewById(R.id.textView);
        TestDto testDto = (TestDto) getIntent().getExtras().getSerializable("testDto");
        textView.setText(testDto.toString());
    }
}

次に、SubActivityを呼び出す側のmain.xmlを以下のようにしてボタンを1つ増やす。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <EditText
        android:id="@+id/urlEditText"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:text="http://www.google.co.jp" />
    <Button
        android:id="@+id/browserButton"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:text="ブラウザ表示" />
    <Button
        android:id="@+id/serializableButton"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:text="オブジェクト受け渡し" />
</LinearLayout>

SubActivityを呼び出す、MainActivity.javaを以下のようにする。TestDtoにデータを入れて、putExtraでデータを渡しているだけである。

package sample.it2;

import sample.dto.TestDto;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
    private EditText urlEditText;
    private Button browserButton;
    private Button serializableButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        urlEditText = (EditText) findViewById(R.id.urlEditText);
        browserButton = (Button) findViewById(R.id.browserButton);
        serializableButton = (Button) findViewById(R.id.serializableButton);

        browserButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("net.kuwalab.web");
                intent.setData(Uri.parse(urlEditText.getText().toString()));
                startActivity(intent);
            }
        });

        serializableButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), SubActivity.class);
                intent.setAction(Intent.ACTION_VIEW);
                TestDto testDto = new TestDto();
                testDto.setIntData(100);
                testDto.setStringData(urlEditText.getText().toString());
                intent.putExtra("testDto", testDto);
                startActivity(intent);
            }
        });
    }
}

最後に、明示的なAcitvity呼び出しであるためAndroidManifest.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="sample.it2"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SubActivity">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />
</manifest>

実行結果は以下。オブジェクトがSubActivityに渡されて、その内容が表示されているのがわかる。