2010年9月6日月曜日

Android 別のアクティビティを開く(戻り値を受け取る)

Android 別のアクティビティを開く(戻り値 を受け取らない) では開くアクティビティに対して情報を渡しましたが 今度は開いたアクティビティから情報を受け取る方法です。

MainActivityでEditTextに値を入力し次へをクリックする。


SubActivityを開き、MainActivityで入力した値をTextViewに表示する。
SubActivityでEditTextに値を入力しOKをクリックする。


MainActivityに戻り、SubActivityで入力した値をTextViewに表示する。



別のアクティビティを開くにはインテント(Intent)クラスを使用します。

Intentクラスのコンストラクタの第1引数に現画面アクティビティのインスタンス、第2引数に呼び出すアクティビティのクラスを指定して
Intentインスタンスを作成します。
Intent(Context packageContext, Class cls)

IntentインスタンスのputExtra()メソッドを使って、アクティビティに渡したい値を指定します。
値はMapで保持されているので、キーと値のペアで設定します。
public Intent putExtra (String name, String value)

開いたアクティビティから情報を受け取らない場合は
ActivityインスタンスのstartActivity()メソッドを使ってアクティビティを起動します。
public void startActivity (Intent intent)

開いたアクティビティから情報を受け取る場合は、
AcrivityインスタンスstartActivityForResult()メソッドを使ってアクティビティを起動します。
第1引数には、インテントインスタンスを渡します。
第2引数には、リクエストコードと呼ばれる値を指定します。
これは開いたアクティビティから再び戻ってきたときに、どのアクティビティから戻ってきたかを区別するための値です。0以上の数値を指定します。
public void startActivityForResult (Intent intent, int requestCode)

開いたアクティビティから戻ってきたときは、onActivityResulty()メソッドが呼ばれます。
protected void onActivityResult(int requestCode, int resultCode, Intent intent)


開いたアクティビティでは
ActivityインスタンスのgetIntent()メソッドでIntentインスタンスを取得します。
public Intent getIntent ()

IntentインスタンスのgetExtras()メソッドで渡された値のMapを取得します。
public Bundle getExtras ()

元の画面に戻す情報はsetResult()メソッドで設定します。
public final void setResult (int resultCode, Intent data)

MainActivity.java
package my.study.android;  

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

public class MainActivity extends Activity {
 
    private static final int SUBACTIVITY = 1;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //次へボタンのイベントリスナー設定
        Button buttonNext = (Button)findViewById(R.id.buttonNext);
        buttonNext.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                buttonNext_OnClickListener(v);    
            }});
    }
    
    /*
     * 
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        TextView label = (TextView)findViewById(R.id.labelFromSub);
        if (requestCode == SUBACTIVITY){
            if (resultCode == RESULT_OK){
                Bundle extras = intent.getExtras();
                if (extras != null){
                    label.setText("SubActivityで入力した値:"+extras.getString("SUB_INPUT_STRING"));
                }else{
                    label.setText("SubActivityで入力した値:" + "extra is null");   
                 }
            }else{
                label.setText("SubActivityで入力した値:");
            }
        }
    }
    
    /*
     * 次へボタンクリック処理
     */
    private void buttonNext_OnClickListener(View v) {
        //エディットボックスの値を渡してSubActivityを開く
        EditText textInput = (EditText)findViewById(R.id.textMain);
        Intent intent = new Intent(this,SubActivity.class);
        intent.putExtra("MAIN_INPUT_STRING", textInput.getText().toString());
        //startActivity(intent);
        startActivityForResult(intent, SUBACTIVITY);
    }

}

SubActivity.java
package my.study.android;

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

public class SubActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);
        //OKボタンのイベントリスナー設定
        Button buttonOk = (Button)findViewById(R.id.buttonOk);
        buttonOk.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                buttonOK_OnClickListener(v);    
            }});
        //キャンセルボタンのイベントリスナー設定
        Button buttonCancel =(Button)findViewById(R.id.buttonCancel);
        buttonCancel.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                buttonCancel_OnClickListener(v);    
            }});
        //MainActivityから受け取った値を表示します。
        TextView label = (TextView)findViewById(R.id.labelFromMain);
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null){
            label.setText("MainActivityで入力した値:"+extras.getString("MAIN_INPUT_STRING"));
        }else{
            label.setText("MainActivityで入力した値:" + "extra is null");   
        }
  
    }
    /*
     * キャンセルボタンクリック処理
     */
    private void buttonCancel_OnClickListener(View v) {
        setResult(RESULT_CANCELED);
        finish();
    }
    /*
     * OKボタンクリック処理
     */
    private void buttonOK_OnClickListener(View v) {
        EditText textInput = (EditText)findViewById(R.id.textSub);
        Intent intent = new Intent();
        intent.putExtra("SUB_INPUT_STRING", textInput.getText().toString());
        setResult(RESULT_OK,intent);
        finish();
    }
}


MainActivityのレイアウト(res/layout/main.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"
    >

<EditText 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:id="@+id/textMain">
</EditText>

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/buttonNext" 
    android:text="次へ">
</Button>

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="SubActivtyで入力した値:" 
    android:id="@+id/labelFromSub">
</TextView>

</LinearLayout>

SubActivityのレイアウト(res/layout/sub.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical">
<TextView android:layout_height="wrap_content" android:text="MainActivityで入力した値:" android:id="@+id/labelFromMain" android:layout_width="fill_parent"></TextView>

<EditText 
 android:layout_height="wrap_content" 
 android:layout_width="fill_parent" 
 android:id="@+id/textSub">
</EditText>

<Button 
    android:layout_height="wrap_content" 
    android:id="@+id/buttonOk" 
    android:text="OK" 
    android:layout_width="wrap_content">
</Button>

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/buttonCancel" 
    android:text="Cancel">
</Button>

</LinearLayout>

0 件のコメント: