【Android】【Java】【Kotlin】Intentを使った画面遷移時の値受け渡し方法

こんにちは、kazuです。
本日は画面遷移時した時の値受け渡し方法を記事にしていきます。

はじめに

画面間で値を受け渡したいと思ったことはありませんか?
Androidでは共通で値を持たすなど考え方は多々ありますが、共通で値を持たすやり方を行うと管理が大変になるのと、
重くなりやすくなるなどアプリの不具合につながることがあります。
なので渡せるところであれば渡した方が良いなどあると思いますので、今回はIntentを使った値渡しをKotlinとJavaで実装を行なっていきます。

Javaの実装

では実際に実装を見てみましょう!

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 画面に遷移する
    mBinding.secondButton.setOnClickListener(v -> {
        // 遷移先に渡す数値
        int intValue = 2;
        // 遷移先に渡す文字列
        String stringValue = "JavaのIntent";
        // 画面遷移を行う
        IntentSampleActivity.start(this, intValue, stringValue);
    });
}
// key
private final static String INT_KEY = "INT_VALUE";
private final static String STRING_KEY = "STRING_VALUE";     
// 引数にセットする値、セットする文字列を入れている
public static void start(Activity activity, int intValue, String stringValue) {
    // Intentのインスタンス作成
    Intent intent = new Intent(activity, IntentSampleActivity.class);
    // 渡したい数値をセットする
    intent.putExtra(INT_KEY, intValue);
    // 渡したい文字列をセットする
    intent.putExtra(STRING_KEY, stringValue);
    // 画面遷移を実行する
    activity.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ・・・
    // ActivityからIntentを取得する
    Intent intent = getIntent();
    // 数値を取得する
    int intValue = intent.getIntExtra(INT_KEY, 0);
    // xmlに値をセットする
    intText.set(String.valueOf(intValue));
    // 文字列を取得する
    String stringValue = intent.getStringExtra(STRING_KEY);
    // xmlに値をセットする
    stringText.set(stringValue);
}

簡単に説明していきます。startメソッドを遷移元Activityでstartメソッドを呼ぶように実装しました。
startメソッドの引数には渡したい値をセットしています。(今回は数値と文字列です。)
次にstartメソッドが呼ばれるとIntentインスタンスを生成してputExtraに値をセットする必要があり、putExtraは2つ値を入れる必要があります。
1つ目の値がkey(いわゆる値を入れる箱の名前)2つ目が実際に渡す値になります。(今回だとintValue、stringValue)最後にstartActivityを実行します。
startActivityが実行した後遷移先のonCreateが実行されるので、実行後getIntent()を取得します。
その後int値ならgetIntExtra(INT_KEY, 0)から値を取得しstringならgetStringExtra(STRING_KEY)から値を取得します。
またこの時に値を取り出す時に使用するのはputExtraに値を入れたkeyになります。
今回はただ値を画面に表示するようにするだけですが、他にも色々使い方はあると思います。
実際の画像になります。(レイアウトは雑ですみません。笑)

Kotlinの実装

次はKotlinの実装を見ていきましょう!
ちなみに動きは上記で記載したJavaとやっていることは同じです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ボタンクリック処理
    mBinding.secondButton.setOnClickListener(v -> {
        // 遷移先に渡す数値
        int intValueKt = 9;
        // 遷移先に渡す文字列
        String stringValueKt = "KotlinのIntent";
        // 画面遷移処理を実行する
        KtIntentSampleActivity.start(this, intValueKt, stringValueKt);
    }
});
companion object {
    // key
    private const val INT_KEY = "INT_VALUE"
    private const val STRING_KEY = "STRING_VALUE"
    @JvmStatic
    // 引数にセットする数値、セットする文字列を入れている
    fun start(activity: Activity, intValue: Int, stringValue: String?) {
        // Intentインスタンス生成
        val intent =
               Intent(activity, KtIntentSampleActivity::class.java)
        // 渡したい数値をセットする
        intent.putExtra(INT_KEY, intValue)
        // 渡したい文字列をセットする
        intent.putExtra(STRING_KEY,stringValue)
        // 画面遷移を実行する
        activity.startActivity(intent)
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ・・・
        // ActivityからIntentを取得する
        val intent = intent
        // 数値を取得する
        val intValue =
              intent.getIntExtra(INT_KEY, 0)
        // xmlに値をセットする
        intText.set(intValue.toString())
        // 文字列を取得する
        val stringValue =
        intent.getStringExtra(STRING_KEY)
        // xmlに値をセットする
        stringText.set(stringValue)
}

Kotlinの画像になります。

最後に

いかがでしたでしょうか?
今回はJavaとKotlinで比較にようにしていきました。
当たり前ですが、言語違うと同じ動作でも若干書き方が変わりますね。
Kotlinの方がスッキリしています。
Intentの方も少しは伝わりましたか?最初に記載しましたが、共通で保持するとアプリ速度が遅くなったり管理が難しくなったりするので、
できればActivity間で完結できるなら上記で対応したいです。
最後までご覧いただきありがとうございました。