【Android】別画面への値の受け渡し

■ はじめに

https://dk521123.hatenablog.com/entry/2013/09/25/002349
https://dk521123.hatenablog.com/entry/2013/09/26/010117

の続き。
で、画面の遷移を行ったが、値の受け渡しに関して、
何も触れなかったので、今回記載する。

 ■ サンプル

 例1:Kotlin

Case1:標準APIを使用する

// ここでは、一部を抜粋。
wordListView.setOnItemClickListener {
        parent, view, position, id ->
    val englishWord =
        parent.getItemAtPosition(position) as EnglishWord

    val intentToMoveEditPage = Intent(
        this, EditActivity::class.java)
    // ★ここに注目:ここで渡している★
    intentToMoveEditPage.putExtra("english_word_id", englishWord.id)

    startActivity(intentToMoveEditPage)
}

// 受け取る側
val englishWordId = intent.getStringExtra("english_word_id")

https://qiita.com/Takarkiz/items/61f7b1a8fe6a41ae171d
Case2:Kotlinライブラリ Anko を利用する場合

// ここでは、一部を抜粋。

// startActivityの引数に指定
this.startActivity<EditCommentActivity>("comment_id" to comment.id)
受け渡し先の画面 : EditCommentActivity.kt 
// intent?.getXxxExtraで受け取る(第一引数:キー、第二引数:デフォルト値)
val commentId = intent?.getLongExtra("comment_id", -1L)

例2:Java

 * 受け渡し元の画面:Intent(インテント)のメソッド putExtra() を受け渡す値を設定
 * 受け渡し先の画面:Intent(インテント)のメソッド getStringExtra() で受けとる

デザイン部

 * 画面を追加する
  + 「activity_main.xml」(メイン画面)
   => button x 1, EditText x 1 を追加
  + 「activity_sub.xml」 (サブ画面)
   => button x 1, TextView x 1 を追加

プログラム部(受け渡し元の画面) : MainActivity.java

package com.example.androidhelloworld;

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

public class MainActivity extends Activity implements OnClickListener {
    private Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.button1 = (Button) findViewById(R.id.button1);
        this.button1.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            // インテントのインスタンス生成
            Intent intent = new Intent(MainActivity.this, SubActivity.class);
            
            // EditTextのオブジェクトを取得
            EditText editText1 = (EditText)findViewById(R.id.editText1);
            
            // !Point! インテントに値をセット
            intent.putExtra("Key", editText1.getText().toString());
    
            // 次画面のアクティビティ起動
            startActivity(intent);
            break;
        }
    }
}

プログラム部(受け渡し先の画面) : SubActivity.java

package com.example.androidhelloworld;

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

public class SubActivity extends Activity implements OnClickListener {

    private Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
        this.button1 = (Button) findViewById(R.id.button1);
        this.button1.setOnClickListener(this);
        
        TextView textView1 = (TextView)findViewById(R.id.textView1);
        // インテントを取得
        Intent intent = getIntent();
        // !Point! インテントに保存されたデータを取得
        String recivedData = intent.getStringExtra("Key");
        // 受け取ったデータを表示
        textView1.setText(recivedData + " love you!");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            // インテントのインスタンス生成
            Intent intent = new Intent(SubActivity.this, MainActivity.class);
            // 次画面のアクティビティ起動
            startActivity(intent);
            break;
        }
    }
}

その他 : AndroidManifest.xml
https://dk521123.hatenablog.com/entry/2013/09/26/010117

と同じなので、省略。

関連記事

ボタンイベントを処理するには
https://dk521123.hatenablog.com/entry/2013/09/25/002349
画面遷移をするには
https://dk521123.hatenablog.com/entry/2013/09/26/010117