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

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

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

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

Android Studio

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

Q&A

解決済

1回答

2195閲覧

元の画面(MainActivity)に遷移すると同時に、元の画面のメソッドを実行させたい

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2021/09/24 11:31

結果画面(ResultActivity.java)から、ボタンクリックで元の画面(MainActivity.java)に戻るときに、同時に元の画面のメソッドを実行したいです。
ゲームの結果画面のボタン「もう一度やる」をクリックすると、元の画面の初期状態で表示したい、という意味です。

下は、ResultActivity.javaの一部ですが、3,4行目の

if (view.getId() == R.id.bt_mouitido) {

startActivity(new Intent(getApplicationContext(), MainActivity.class));

の部分で元の画面に戻るのですが、ここにメソッドを追加する方法を教えてください。
よろしくお願いします。

java

1View.OnClickListener event = new View.OnClickListener() { 2 public void onClick(View view) { 3 if (view.getId() == R.id.bt_mouitido) { 4 startActivity(new Intent(getApplicationContext(), MainActivity.class)); 5 } else if (view.getId() == R.id.bt_hozon) { 6 highscoreLabel.setText(score + "てん"); 7 SharedPreferences.Editor editor = sharedPreferences.edit(); 8 editor.putInt("HIGH_SCORE", score); 9 editor.apply(); 10 bt_hozon.setVisibility(View.INVISIBLE); 11 } else if (view.getId() == R.id.bt_owaru) { 12 finish(); 13 } 14 } 15 }; 16 bt_mouitido.setOnClickListener(event); 17 bt_hozon.setOnClickListener(event); 18 bt_owaru.setOnClickListener(event);

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

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

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

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

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

guest

回答1

0

ベストアンサー

元の画面(MainActivity.java)に戻るときに

startActivity は「戻る」処理ではありません。あくまで指定したアクティビティを起動するメソッドです。
startActivity を実行する度に新たなインスタンスが作られ、古いアクティビティは残ったままメモリを圧迫し続けることになるのではないでしょうか。

アクティビティを実行し、その終了を待って処理を続ける方法があります(以前は startActivityForResult でしたが Deprecated になりまして、 androidx で registerForActivityResult を使うようになったようです)ので、そちらを用いれば、指定したアクティビティの終了後に必要なメソッドを実行することが出来るのでは…と思います。


MainActivity.java

java

1package com.teratail.q361159; 2 3import android.app.Activity; 4import android.content.Intent; 5import android.os.Bundle; 6import android.util.Log; 7import android.widget.Button; 8 9import androidx.activity.result.ActivityResultLauncher; 10import androidx.activity.result.contract.ActivityResultContracts; 11import androidx.appcompat.app.AppCompatActivity; 12 13public class MainActivity extends AppCompatActivity { 14 private static final String TAG = "MainActivity"; 15 16 private int score = 123; 17 18 private ActivityResultLauncher<Intent> startForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result->{ 19 switch(result.getResultCode()) { 20 case Activity.RESULT_OK: 21 //Activity から戻って必要なメソッドを呼ぶ 22 //Intent intent = result.getData(); 23 Log.d(TAG, "ActivityResultLauncher result="+result); 24 break; 25 case ResultActivity.RESULT_OWARU: 26 Log.d(TAG, "ActivityResultLauncher OWARU"); 27 finish(); 28 break; 29 } 30 }); 31 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 37 Button button = findViewById(R.id.button); 38 button.setOnClickListener(v -> { 39 //保存画面へ 40 startForResult.launch(new Intent(this, ResultActivity.class) 41 .putExtra(ResultActivity.PARAM_SCORE, score)); 42 }); 43 } 44}

レイアウト: activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <Button 11 android:id="@+id/button" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="Hello World!" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>

ResultActivity.java

java

1package com.teratail.q361159; 2 3import android.app.Activity; 4import android.content.SharedPreferences; 5import android.os.Bundle; 6import android.widget.*; 7 8import androidx.appcompat.app.AppCompatActivity; 9 10public class ResultActivity extends AppCompatActivity { 11 public static final String PARAM_SCORE = "SCORE"; 12 public static final int RESULT_OWARU = Activity.RESULT_FIRST_USER; 13 14 public static final String SHARED_NAME = "GAME_DATA"; 15 public static final String KEY_HIGHSCORE = "HIGH_SCORE"; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_result); 21 22 TextView scoreLabel = findViewById(R.id.scoreLabel); 23 TextView highScoreLabel = findViewById(R.id.highScoreLabel); 24 Button bt_mouitido = findViewById(R.id.bt_mouitido); 25 Button bt_hozon = findViewById(R.id.bt_hozon); 26 Button bt_owaru = findViewById(R.id.bt_owaru); 27 28 int score = getIntent().getIntExtra(PARAM_SCORE, 0); 29 scoreLabel.setText(score + ""); 30 31 SharedPreferences sharedPreferences = getSharedPreferences(SHARED_NAME, MODE_PRIVATE); 32 int highScore = sharedPreferences.getInt(KEY_HIGHSCORE, 0); 33 34 highScoreLabel.setText("High Score : " + Math.max(highScore, score)); 35 36 bt_mouitido.setOnClickListener(v->{ 37 setResult(Activity.RESULT_OK, null); 38 finish(); 39 }); 40 41 bt_hozon.setEnabled(highScore < score); 42 43 bt_hozon.setOnClickListener(v->{ 44 SharedPreferences.Editor editor = sharedPreferences.edit(); 45 editor.putInt(KEY_HIGHSCORE, score); 46 editor.apply(); 47 bt_hozon.setEnabled(false); 48 }); 49 50 bt_owaru.setOnClickListener(v->{ 51 setResult(RESULT_OWARU, null); 52 finish(); 53 }); 54 } 55}

レイアウト: activity_result.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".ResultActivity"> 9 10 <TextView 11 android:id="@+id/scoreLabel" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="0" 15 app:layout_constraintBottom_toTopOf="@id/highScoreLabel" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20 <TextView 21 android:id="@+id/highScoreLabel" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="0" 25 app:layout_constraintBottom_toTopOf="@id/bt_mouitido" 26 app:layout_constraintLeft_toLeftOf="parent" 27 app:layout_constraintRight_toRightOf="parent" 28 app:layout_constraintTop_toBottomOf="@id/scoreLabel" /> 29 30 <Button 31 android:id="@+id/bt_mouitido" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" 34 android:text="もう一度" 35 app:layout_constraintBottom_toTopOf="@id/bt_hozon" 36 app:layout_constraintLeft_toLeftOf="parent" 37 app:layout_constraintRight_toRightOf="parent" 38 app:layout_constraintTop_toBottomOf="@id/highScoreLabel" /> 39 <Button 40 android:id="@+id/bt_hozon" 41 android:layout_width="wrap_content" 42 android:layout_height="wrap_content" 43 android:text="保存" 44 app:layout_constraintBottom_toTopOf="@id/bt_owaru" 45 app:layout_constraintLeft_toLeftOf="parent" 46 app:layout_constraintRight_toRightOf="parent" 47 app:layout_constraintTop_toBottomOf="@id/bt_mouitido" /> 48 <Button 49 android:id="@+id/bt_owaru" 50 android:layout_width="wrap_content" 51 android:layout_height="wrap_content" 52 android:text="終わる" 53 app:layout_constraintBottom_toBottomOf="parent" 54 app:layout_constraintLeft_toLeftOf="parent" 55 app:layout_constraintRight_toRightOf="parent" 56 app:layout_constraintTop_toBottomOf="@id/bt_hozon" /> 57 58</androidx.constraintlayout.widget.ConstraintLayout>

投稿2021/09/24 15:43

編集2021/09/24 17:59
jimbe

総合スコア13209

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

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

aruko

2021/09/25 11:13

すごく具体的なコードを考えてくださって、ありがとうございます。 ゆっくり一つ一つを見ていくと、理解できるところも多くありますが、現在の私では、悲しいことに…、やや理解不能で申し訳ないです。 しばらくの間、少しずつ考えさせてもらいます。 あれから色々ボタンの内容を追加したり、コードを変更したりしているうちに、ある程度できてきたのですが、疑問点が出てきました。 jimbeさんが言われる ーーー「startActivity は「戻る」処理ではありません。あくまで指定したアクティビティを起動するメソッドです。startActivity を実行する度に新たなインスタンスが作られ、古いアクティビティは残ったままメモリを圧迫し続けることになるのではないでしょうか。」ーーー に関係することです。 ResultActivityの画面で、「終わる」ボタンを押したときに、finish();を用いてみましたが、MainActivityの画面の直前の状態に戻るので、startActivityとは、前の画面の上に次の画面が2枚重ねのようになるイメージだと感じました。 それがfinish()でResultActivityが終わるから、下のMainActivityが出てくる。 また、ResultActivityで「もう一度」ボタンを押すと、MainActivityの初期状態になるよう、再び Intent intent = new Intent(ResultActivity.this,MainActivity .class); startActivity(intent); と書いたら、うまくできました。 ただし、これは、jimbeさんのご指摘の通りもしかしたら、MainActivity―ResultActivity―MainActivityの三枚重ねのようになっているのかと思います。 そこで教えていただきたいのは、 ①この3枚重ねのようなやり方ではなく、ResultActivityを消して(なくして)MainActivutyの直前状態ではなく初期状態に戻りたい。(回答のコードにあるとは思いますが…) ②「終わる」ボタンは、完全にゲームを終わらせたいので、ここをどのように書けば、MainActivityもResultActivityも終わらせることができるのか。 この2点についてよろしくお願いします。
jimbe

2021/09/25 12:00 編集

ご提示させていただいたコードは実行できます。 各ボタンのリスナの部分が "ラムダ式" という見慣れない形で書いてありますので戸惑われるかと思いますが、要は(この場合は)「"v->{" と "}" の間にそのボタンがクリックされた時のコードを書くことが出来る」というだけです。 >2枚重ね >三枚重ね イメージは私も同じです。 ① につきまして、MainActivity で「//Activity から戻って必要なメソッドを呼ぶ」と書いた所が ResultActivity で「もう一度」ボタンを押されて(ResultActivity が finish して MainActivity が現れて)から実行される個所になります。 今はそこに Log.d を入れていますので、実行して頂くと「もう一度」ボタンを押す度に(MainActivityが現れて)ログが表示されるのが確認出来ると思います。 ですので、その個所に MainActivity を初期表示状態にする処理・メソッドの呼び出し等を入れて頂けば、ご希望の状態になるのではないでしょうか。 ② につきましては、入れてあります。 ResultActivity で bt_owaru ボタンをクリックすると、「 MainActivity に RESULT_OWARU を返す設定」をして finish します。(ResultActivity の終わり) MainActivity は RESULT_OWARU を受け取ると、ログに "ActivityResultLauncher OWARU" と表示して finish します。(MainActivity の終わり) android アプリは属する Activity が全て終わると終わります。
aruko

2021/09/26 02:48

ぼちぼち進めています。 RESULT_OWARUについては分かりましたが、RESULT_OKについて分からないことがあるので、お願いします。 MainActivity.javaで、 private ActivityResultLauncher<Intent> startForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result->{ switch(result.getResultCode()) { case Activity.RESULT_OK: //Activity から戻って必要なメソッドを呼ぶ //Intent intent = result.getData(); Log.d(TAG, "ActivityResultLauncher result="+result); break; case ResultActivity.RESULT_OWARU: Log.d(TAG, "ActivityResultLauncher OWARU"); finish(); break; } }); の、 ①case Activity.RESULT_OK:の下の部分で、例えばどのようにメソッドを書けばよいかを教えていただきたいです。 もう一つ、 ResultActivity.javaで、 ②public static final int RESULT_OWARU = Activity.RESULT_FIRST_USER; という部分があるのですが、この意味を教えてください。 ③ public static final int RESULT_OWARU = Activity.RESULT_FIRST_USER;というのはあるのですが、RESULT_OKについての宣言がないのはどうしてでしょうか。 いつもすみません。 よろしくお願いします。
dodox86

2021/09/26 03:43

@質問者さん 回答主ではなく横からですみませんが、基本的に1質問につき1回答がマナーだと思います。添削のサービスではないし、回答者さんの負担が増えるばかりです。
jimbe

2021/09/26 06:26 編集

まぁ、とりあえず私の書いたコードに関しましてはご説明が必要かとは思いますので。 ① ですが、ご質問では「元の画面の初期状態」にしたいとされています。具体的にどのような状態が「初期状態」でしょうか。 例えばどこかのフィールドが空白になるとか、ボタンのEnable/Disable が変わるとか、内部的には何かのカウンタが初期値になるとか、そういったことかと思います。 そのような処理を MainActivity の(例えば initialize() といった) メソッドに纏め、それを該当箇所で呼び出す…といったことを想定しています。 ② RESULT_OWARU を Activity.RESULT_FIRST_USER としていますのは、既存の定数とぶつからないためです。 この手法(?)は結構古いもので、システムの定数とユーザの定数のどちらも扱う処理を作る際、定数の一定範囲をシステム用として使用不可とし、別の範囲をユーザ用として開放する方法があります。 Activity.RESULT_XXX は Activity.RESULT_OK や Activity.RESULT_CANCELED が既に定義されていますが、ユーザがそれ以外の何かを表したい場合はそれらと同じ値にならないように定義する必要があります。 具体的には、Activity.RESULT_OK は -1、Activity.RESULT_CANCELED は 0 と定義されています。少なくともユーザが別の何かを表したい場合は 0 と -1 は避けないといけないわけですね。じゃあ -2 とか 10 とかでいいじゃないかと言えまして実際それでも動作するとは思いますが、万が一、既存の定数値が変更されないとも限りません。そこで、利用できる定数としてさらに Activity.RESULT_FIRST_USER が 1 として定義されており、ドキュメントの説明は「Start of user-defined activity results.」つまりユーザが定義する値の始まり、とされています。( https://developer.android.com/reference/android/app/Activity#RESULT_FIRST_USER ) これは先の「定数の一定範囲をシステム用として使用不可とし、別の範囲をユーザ用として開放」の "開放する範囲の一端" を示していまして、「必要なら Activity.RESULT_FIRST_USER 以降(以上)の値を定義して使ってください」という意味になります。 ということで、RESULT_OWARU は Activity.RESULT_FIRST_USER として定義しました。もしもっと RESULT_XXX が必要になりましたら、Activity.RESULT_FIRST_USER+1、Activity.RESULT_FIRST_USER+2、 …という風に増やしていくことになります。 ③ RESULT_OK は Activity で定義されている定数です。ですので別途定義する必要はありません。また、 ResultActivity.RESULT_OK という書き方でも問題ありません。
aruko

2021/09/26 11:52

まだ理解が難しい部分はありますが、具体的なコードで教えてくださったところは、自分の作成中アプリに入れさせてもらいました。 ほんとにありがとうございました。 そして、さらにまた疑問点が出てきましたが、この質問のタイトルとは少しずれてきたので、新たに質問を作成していくことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問