別画面から値を返戻
〜 Android Studio の使い方 10 〜
2023-05-23 作成 福島
TOP > androidstudio > bounceback

使用ツール

    Android Studio Flamingo | 2022.2.1 Patch 2  


1. 通常のプロジェクトを作成する。

ここでは  トースト  を利用して値を表示するので、画面の存在するプロジェクトを作成する。
「Empty Activity」「Empty Views Activity」等のプロジェクトが対象。
「No Activity」でも構わないが、Default Activity の追加が必要になるので、ここでは割愛する。(選択しない)


2. 第二画面を追加

2-1. プロジェクトツリーから MainActivity.java を右クリックし、NewActivityEmpty Views Activity を選択する。

2-2. ダイアログ New Android Activity で下記項目を記入して ボタンをクリックする。
項目内容備考
Activity Name:SubActivity-
☑ Generate a Layout Fileチェックを入れるチェックがデフォルト
Layout Name:activity_sub自動生成されるのでそのまま
Source Language:Java本稿では Java で説明している
2-3. プロジェクトツリーに画面が自動生成されるので確認する。
Android > app > res > layout > activity_sub.xml
今回ここで作成する第二画面は、親画面に値を渡すだけですぐに終了するものとする。
このため、ボタンやテキスト等の部品は配置しない。
サンプルのためにこの構成にしているだけなので、実際は部品の配置を行うことになる。

注意: SubActivity.java 生成直後は MainActivity.java が後ろに隠れるので、編集画面を間違えないようにすること。


3. 第二画面の呼び出しと返戻値受領処理を追加。

クラス MainActivity に以下を記述する
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


// 別画面から返戻値を受け取るメソッド (ラムダ式にしたほうが良いらしい*1) ActivityResultCallback<ActivityResult> activityResultCallback = new ActivityResultCallback() { @Override public void onActivityResult(Object result) { // result を複数個所でキャストすると読みにくくなるので一旦変数に入れる*2 ActivityResult activityResult = (ActivityResult) result; if(activityResult.getResultCode() == RESULT_OK) { Intent intent = activityResult.getData(); if(intent == null) return; int resultValue = intent.getIntExtra("Result", 0); Toast.makeText(MainActivity.this, "返戻値: " + resultValue, Toast.LENGTH_LONG).show(); } } }; // 別画面を起動する用意 ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), activityResultCallback ); // 第二画面を起動する (例として数値 10 を渡す) final int SAMPLE_VALUE = 10; Intent intent = new Intent(this, SubActivity.class); intent.putExtra("name", SAMPLE_VALUE); activityResultLauncher.launch(intent);
} }
*1lambda にできると AndroidStudio から忠告されるが、new を残したいのでそのままにしている。(new ActivityResultCallback() の箇所)
lambda のほうが理解し易いと思う人は Alt + Enter → Replace with lambda で変換してください。

*2クラス ActivityResult には下記の 2 種類があります。
import 文を確認し、androidx (新しい API) を有効にします。
android.app.Instrumentation
androidx.activity.result.ActivityResult


4. 第二画面の処理を追加。

クラス SubActivity (= 第二画面) に以下を記述する
public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);


// 親画面から渡された数値を取り出す Intent intent = getIntent(); int argument = intent.getIntExtra("name", 0); Toast.makeText(this, "引数: " + argument, Toast.LENGTH_LONG).show(); // 親画面に数値を返す intent.putExtra("Result", argument + 1); setResult(RESULT_OK, intent); finish(); // 当該画面を終了する*3
} }
*3ここではサンプルのため、いきなり終了しているが、実際は 等のボタンとリスナーを設置して、そこから終了することになる。