2012年4月11日水曜日

Activityの呼び出し(3)

アクティビティを呼び出したり、アクティビティから戻り値を取得する方法は、前回までに説明しました。
今回は、呼び出した先のアクティビティに値を渡す方法を紹介します。

値を渡すには、インテント(のインスタンス)に値をセットしてstartActivity()やstartActivityForResult()を呼び出します。インテントに値をセットする方法は、putExtra()メソッドに数値や文字列、配列等を、キーワードと共に指定します。

以下は、テキストを入力して、それを別のアクティビティで表示するサンプルです。

ActivityTest3aActivity.java
package jp.co.triware.samples.ActivityTest3a;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

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

        Button btnOpen = (Button)findViewById(R.id.open_btn);
        btnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText)findViewById(R.id.text_et);
                String buf = et.getText().toString();
                Intent intent = new Intent();
                intent.setClass(getApplicationContext(), SubActivity.class);
                String pkg = getPackageName();
                intent.putExtra(pkg + ".input", buf);
                startActivity(intent);
            }
        });
    }
}

20-21行目で入力したテキストを取得して、24-25行目でインテントにセットしています。

putExtra()の第1引数には、キーワードとも言うべき名前をセットします。これは単に"input"のような文字列でも動いてくれますが、リファレンスを見ると、
The name must include a package prefix, for example the app com.android.contacts would use names like "com.android.contacts.ShowAll".
と、パッケージ名を含めるように書いてありますのでそのようにしました。

putExtra()の第2引数は、今回はString型の変数を指定しています。数値であればint型やfloat型の変数を指定します。putExtra()は、引数(の型)が異なるメソッドが多重定義(オーバーロード)してありますので、セットしたい型がString以外であってもputExtra()を使います。

SubActivity.java
package jp.co.triware.samples.ActivityTest3a;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

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

        Intent intent = getIntent();
        String pkg = getPackageName();
        String buf = intent.getStringExtra(pkg + ".input");
        EditText et = (EditText)findViewById(R.id.text_et);
        et.setText(buf);

        Button btnClose = (Button)findViewById(R.id.close_btn);
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}
16-18行目で、値を受け取ります。値をセットするときはputExtra()を使いましたが、取得はgetです。型は自動的にはわかりませんので、型名を含めたメソッド名になります。今回はStringですので、getStringExtra()になります。引数は、呼び出し元で指定した名前ですので、今回の場合は「パッケージ名」+「.input」です。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="[Main Activity] Please input your message:"
        />
    <EditText
        android:id="@+id/text_et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        />
    <Button
        android:id="@+id/open_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="OPEN"
        />
</LinearLayout>
テキストを入力するためのEditTextを用意します。

sub.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="[Sub Activity] Received message:"
        />
    <EditText
        android:id="@+id/text_et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        />
    <Button
        android:id="@+id/close_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="CLOSE"
        />
</LinearLayout>
受け取ったテキストを表示するためにEditTextを用意します(TextViewでも構いません)。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.triware.samples.ActivityTest3a"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ActivityTest3aActivity"
            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" />
    </application>

</manifest>
アクティビティを追加しましたので、忘れずにマニフェストファイルにも追記します(22行目)。

実行結果
MainActivityで入力した文字列が、SubActivityで表示されています。

次回は、呼び出し先のアクティビティから戻ってきた際に、値を受け取るサンプルを作ります。

0 件のコメント:

コメントを投稿