使用ツール
Android Studio Flamingo | 2022.2.1 Patch 2
1. 通常のプロジェクトを作成する。
ここでは トースト を利用して値を表示するので、画面の存在するプロジェクトを作成する。
「Empty Activity」「Empty Views Activity」等のプロジェクトが対象。
「No Activity」でも構わないが、Default Activity の追加が必要になるので、ここでは割愛する。(選択しない)
2. 第二画面を追加
2-1. プロジェクトツリーから MainActivity.java を右クリックし、New → Activity → Empty Views Activity を選択する。
2-2. ダイアログ New Android Activity で下記項目を記入して ボタンをクリックする。
2-3. プロジェクトツリーに画面が自動生成されるので確認する。
項目 内容 備考 Activity Name: SubActivity - ☑ Generate a Layout File チェックを入れる チェックがデフォルト Layout Name: activity_sub 自動生成されるのでそのまま Source Language: Java 本稿では Java で説明している
Android > app > res > layout > activity_sub.xml今回ここで作成する第二画面は、親画面に値を渡すだけですぐに終了するものとする。
このため、ボタンやテキスト等の部品は配置しない。
サンプルのためにこの構成にしているだけなので、実際は部品の配置を行うことになる。
注意: SubActivity.java 生成直後は MainActivity.java が後ろに隠れるので、編集画面を間違えないようにすること。
3. 第二画面の呼び出しと返戻値受領処理を追加。
クラス MainActivity に以下を記述する
*1lambda にできると AndroidStudio から忠告されるが、new を残したいのでそのままにしている。(new ActivityResultCallback() の箇所)
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);
} }
lambda のほうが理解し易いと思う人は Alt + Enter → Replace with lambda で変換してください。
*2クラス ActivityResult には下記の 2 種類があります。
import 文を確認し、androidx (新しい API) を有効にします。
✗ android.app.Instrumentation✓ androidx.activity.result.ActivityResult
4. 第二画面の処理を追加。
クラス SubActivity (= 第二画面) に以下を記述する
*3ここではサンプルのため、いきなり終了しているが、実際は 等のボタンとリスナーを設置して、そこから終了することになる。
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
} }