質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

5835閲覧

intentを使用した複数回の画面遷移について

hojo2021

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/09/23 01:11

androidstudioでゲームアプリを作成しています。
intentを使用した画面遷移について教えていただきたいです。

本やネットで調べると、A→B→Aへの画面遷移の方法はよく出てます。
activityA
→ startActivity(intent)でactivityBを起動
→ finish()でactivityBを終了させることで、もとのactivityAを表示させる。
というものだと思います。

では、A→B→C→Dと遷移させたい場合はどうしたらよいのでしょうか。
ずっとstartActivity(intent)でB、C、D、、、
とアクティビティの起動をいくつも重ねていってしまって問題ないのでしょうか。
それとも不要なアクティビティを順次終了させるべきでしょうか。
でも、もとアクティビティをどのタイミングでどやって終了させたらいいのかもわかりません。

またA→B→C→Dと遷移させたところから、D→Aへと遷移させるには
どのようにコードを書いたらいいですか?

アクティビティAを終了させて、startActivity(intent)でD→Aと遷移させるのか、
D、C、Bと順番にアクティビティを終了させるのか、
正しい書き方を教えていただきたいです。

質問にとりとめがなくなってしまいましたが、
基本的な画面遷移のやりかたについてよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ずっとstartActivity(intent)でB、C、D、、、とアクティビティの起動をいくつも重ねていってしまって問題ないのでしょうか。

これは問題があるでしょう。重ねる限り重ねられた前のアクティビティは存在しています。

私自身はAndroidでゲームの画面を作ったことがないし、その辺りの事情も詳しくはないのですが、世に出廻っているものをみると複数のアクティビティをサイクリックに表示し続けるようなケースはほとんど無いように思います。恐らくは最低限の数の画面でグラフィックやシーンを変えていくことで遷移するような動きがほとんどなのではないでしょうか。

とは言えアクティビティが例えばA→B→C→D→戻ってA...とのようにサイクリックに遷移できない訳でもありません。startActivity()で次のアクティビティを起動するにようにした後、自分自身をfinish()すればよいです。

以下のコード断片はボタンを押すと次の画面をstartActivity()で起動し、自身はfinish()で終了する例です。画面間で引き継ぐべき情報はインテントにputExtra()で収めます。より複雑なデータであれば、インテントに収めた値をもとにPreferenceを使ったりApplication Contextを介したりすればできるでしょう。

Java

1public class MainActivity1 extends AppCompatActivity { 2 3 static final String TAG = "MainActivity1"; 4 private int count = 0; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main1); 10 11 Intent intent = getIntent(); 12 if (intent != null) { 13 count = intent.getIntExtra("IntValue", count); 14 } 15 16 Log.d(TAG, "MainActivity1.count:" + count); 17 Button button1 = (Button)findViewById(R.id.button1); 18 19 // ボタンのテキストに現在のcount値をセット。 20 button1.setText(String.format("MAIN1: %d", count)); 21 button1.setOnClickListener(buttonClick); 22 } 23 24 private View.OnClickListener buttonClick = new View.OnClickListener() { 25 @Override 26 public void onClick(View view) { 27 // 次の画面を開く為のインテント。次の画面への値としてcountの現在値 + 1を入れておく。 28 Intent intent = new Intent(getApplicationContext(), MainActivity2.class); 29 intent.putExtra("IntValue", count + 1); 30 31 // 次のActivityを開く 32 startActivity(intent); 33 34 // 自Activityはfinish() で終了 35 finish(); 36 } 37 };

繰り返しになりますがAndroidのゲームの画面切り替えについてアクティビティを用いた場合の定番の方法があったとしても私自身は知らないので、「質問者hojo2021さんのやりたいことは可能である」ことを示したに過ぎない回答です。
※この回答を読んでAndroidのゲームの開発が得意な方の意見を引き出せれば尚良い、との期待もあります。

投稿2021/09/23 12:14

編集2021/09/23 12:28
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hojo2021

2021/09/25 08:01

丁寧な回答を本当にありがとうございます! しかもデータを引き継ぐ分かりやすいコードまで! やはりいくつもアクティビティを重ねっぱなしは問題があるのですね。 ゲームといっても、クイズ形式のようなもので、 メニュー画面やレベル選択画面や問題、解答画面、 チュートリアル画面、、、と画面が思っていたより多くて、 自由に行き来するにはどうしたらいいのか分からなかったのです。 startActivity(intent); の次にすぐに finish(); で元のアクティビティを終了させて大丈夫なんですね。 教えていただいたApplicationContextについても 使えそうなのでもっと勉強することにします。 ありがとうございました。
dodox86

2021/09/25 08:24

> startActivity(intent); > の次にすぐに > finish(); > で元のアクティビティを終了させて大丈夫なんですね。 そうですね。私自身は今回、ご質問を拝見して「そんな方法、できるのかな? やり方は思い付くけど。」と興味を覚えたので、回答に先立って実験用コードで試した限りで、業務ではやったことは無いのですが。 リファレンスを読む限り特に制限は無いので、 https://developer.android.com/reference/android/app/Activity#finish() お使いのAndroidのバージョンや端末で、この方法でもってたくさんの画面を遷移してみて問題が起きなければ大丈夫だと思います。
jimbe

2021/09/25 09:05

intent を使用「しないで」良ければ、 Fragment をご利用になることをお勧めします。 Activity とはまた違った使い方・注意点等がありますが、公式としては、複数の Activity を行き来するのではなく、Activity は1つにして Fragment を入れ換えて画面遷移を表現する方向になっているように思います、
dodox86

2021/09/25 09:14 編集

jimbeさん、コメントありがとうございます。そうですね、Fragmentの方がより適切であるかもしれません。質問内容の個人的な興味深さから、Fragmentのことがすっかり頭から抜け落ちていました。
hojo2021

2022/02/05 10:35

jimbe様、コメントありがとうございます。 コメントを拝見した後、自分でFragment についていろいろ調べてみました。 データの受け渡しについてがちょっと難しく、挫折気味です。 今回はintentをメインに使用して作成し、 次はFragment を利用してアプリを作成してみたいと思います。 dodox86様、jimbe様、 とてもためになる情報をありおがとうございました。
guest

0

アクティビティの起動と終了は、ユーザによる「戻る」ボタンの動作に関係しています。順番に起動したアクティビティは「バックスタック」に入れられ、戻るボタンを押すとそこから取り出されて続行(もしくは再実行)されます。

公式な説明は以下のドキュメントを参照してください。
タスクとバックスタックについて

投稿2021/09/23 03:19

編集2021/09/23 03:20
jimbe

総合スコア12756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問