ゲームアプリのメイン画面からステージ画面や設定画面、HELP画面などに移行させたいときにはどうするか。そんなときはActivityの画面遷移を使います。またActivityを変えないで画面を変える方法もあります。
尚、こちらはJavaで Kotlinはこちら
2024.1.1
画面遷移
ここではActivityを使った画面遷移を考えてみますが、場合によってはActivityの画面遷移を使わない方法もあります。
● Activityを変えて別のActivityへ画面遷移
- 画面だけでなく使用する変数も全く異なるActivityへの移行
- Activityの変更のため内部処理が多く、多少の遅れもあり得る
●
Fragmentを使用し画面表示を任せる
- Activityは画面管理以外にも色々とtaskがあるので画面の変更だけに使うにはコスト高です。Activityを変えずにFragmentで画面を複数張り付けることが可能です。
FragmentをActivityからコードで設定してHello Worldを表示させてみましたが、今度はActivityからFra...
〇 同一Activityでの画面変更
- 使用する変数は同じだが値が異なる、名簿などで名前、住所などをデータベースから取り出すだけで表示フォーマットは同じ様なケースなど
- Activityの画面遷移に比べて素早くできる(そうなる場合に有効)
- 1つのActivityが複雑な構成になってメンテナンスに支障が出ないように注意
Intent
「Activityを変えて画面遷移」をしたい場合には、Intent を使います。
IntentはActivityやServiceなどのコンポーネントを外部から起動するための仕組みです。
ここでは、画面の基本の遷移だけを扱ってみます。
データを遷移先に渡したり、遷移先からデータを受け取りたい場合は、
アプリの画面遷移とActivity間のデータ転送 を参照してください。
startActivity(Intent)
MainActivity 画面で 「MOVE」 ボタンをタップするとSubActivity 画面に遷移、そこで [RETURN] ボタンのタップでMainActivity に戻る基本的なアプリを作ってみたいと思います。
MainActivity から SubActivity への遷移は
1 2 |
Intent intent = new Intent(MainActivity.this, SubActivity.class); startActivity(intent); |
Intent のインスタンスを、現在のActivityから、遷移先のActivityを引数に入れて生成します。
MainActivity.this, SubActivity.class
と設定して、テストで動かすぐらいであれば問題はないのですが、何度も同じ画面移動が繰り返されると強参照のためメモリがパイルアップし続けてOut of Memoryとなる可能性があります。
状況に応じてgetApplication()などに変更したほうがいいようです
1 2 |
Intent intent = new Intent(getApplication(), SubActivity.class); startActivity(intent); |
SubActivity からの戻りは
Activity を終了させます
1 |
finish(); |
Manifestに SubActivity を追加
1 2 3 |
<activity android:name=".SubActivity" > </activity> |
基本的にはこれだけです。
サンプルコード
まとめてみます。その前にSubActivityとして別のJavaファイルを作らないといけません。
一番左の階層から「app」「java」「xxx.xxx.xxx」を選択して
「New」「Java Class」から新しいClass ファイルを作ります。
MainActivityと同じレベルにSubActivityができればOKです。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//package com.example.testactivitytoactivity; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import android.content.Intent; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); Button sendButton = findViewById(R.id.send_button); // lambda式 sendButton.setOnClickListener(v -> { Intent intent = new Intent(getApplication(), SubActivity.class); startActivity(intent); }); } } |
レイアウトですがわかりやすくするために文字を大きくしたりしています
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:text="@string/main_activity" android:textSize="30sp" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3"/> <Button android:id="@+id/send_button" android:text="@string/move" android:textSize="30sp" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
追加したjavaに記述します。
SubActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//package com.example.testactivitytoactivity; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import android.widget.Button; public class SubActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_sub); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.sub), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); Button returnButton = findViewById(R.id.return_button); // lambda式 returnButton.setOnClickListener(v -> finish()); } } |
SubActivityで読んでいるレイアウトファイルも作成する必要がありますが、
「New」「XML」「Layout XML File」から作れます。あるいはFileからでも可能です。
activity_sub.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sub" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SubActivity"> <TextView android:text="@string/sub_activity" android:textSize="30sp" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3"/> <Button android:id="@+id/return_button" android:text="@string/return_sub" android:textSize="30sp" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
リソースファイルです。retrunというキーワードは予約語なので使えないですね
strings.xml
1 2 3 4 5 6 7 |
<resources> <string name="app_name">TestActivityToActivity</string> <string name="main_activity">Main Activity</string> <string name="move">MOVE</string> <string name="sub_activity">Sub Activity</string> <string name="return_sub">RETURN</string> </resources> |
マニフェストです
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application ... tools:targetApi="34"> <activity android:name=".MainActivity" ... </activity> <activity android:name=".SubActivity" > </activity> </application> </manifest> |
戻りは、ユーザーのリターンキーをタップしても戻れます
Kotlinではこのようになります。
関連ページ:
References:
アクティビティ | Android Developers
一般的なインテント | Android Developers