🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

1006閲覧

条件付きの任意の画像を表示できない。

htnk_4a

総合スコア3

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/12/20 15:59

前提・実現したいこと

このプログラムで三回勝ったときor三回負けたときにirasutoyahappy.png or irasutoyabad.pngを表示できるようにしたいのと、"次へ"というボタンをじゃんけんが終わるごとに表示したいです。
情報が足りない場合は載せますのでご指摘ください。

コード ///main_activity/// package com.example.janken import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.preference.PreferenceManager import androidx.core.content.edit import kotlinx.android.synthetic.main.activity_main.* import android.view.View as View1 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView(R.layout.activity_test3) setContentView(R.layout.activity_main) gu.setOnClickListener { onJankenButtonTapped(it) } choki.setOnClickListener { onJankenButtonTapped(it) } pa.setOnClickListener { onJankenButtonTapped(it) } val pref = PreferenceManager.getDefaultSharedPreferences(this) pref.edit { clear() } } fun onJankenButtonTapped(view: View1?) { val streak = this.intent.getIntExtra("streak", 0) val intent = Intent(this, ResultActivity::class.java) intent.putExtra("MY_HAND", view?.id) intent.putExtra("streak", streak) startActivity(intent) } }
コード ///result_activity/// package com.example.janken import android.content.Intent import android.os.Bundle import android.preference.PreferenceManager import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.content.edit import kotlinx.android.synthetic.main.activity_result.* class ResultActivity : AppCompatActivity() { val gu = 0 val choki = 1 val pa = 2 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) val id = intent.getIntExtra("MY_HAND", 0) val myHand: Int myHand = when (id) { R.id.gu -> { myHandImage.setImageResource(R.drawable.gu) gu } R.id.choki -> { myHandImage.setImageResource(R.drawable.choki) choki } R.id.pa -> { myHandImage.setImageResource(R.drawable.pa) pa } else -> gu } // コンピュータの手を決める val comHand = getHand() when (comHand) { gu -> comHandImage.setImageResource(R.drawable.com_gu) choki -> comHandImage.setImageResource(R.drawable.com_choki) pa -> comHandImage.setImageResource(R.drawable.com_pa) } // 勝敗を判定する val gameResult = (comHand - myHand + 3) % 3 when (gameResult) { 0 -> resultLabel.setText(R.string.result_draw) // 引き分け 1 -> resultLabel.setText(R.string.result_win) // 勝った場合 2 -> resultLabel.setText(R.string.result_lose) // 負けた場合 } backButton.setOnClickListener { finish() } var streak = intent.getIntExtra("streak", 0) when (gameResult) { 0 -> { resultLabel.setText(R.string.result_draw) // 引き分け // 引き分けの場合はカウントを0に戻す streak = 0 } 1 -> { resultLabel.setText(R.string.result_win) // 勝った場合 // 連敗中の場合は値を0に戻す if(streak < 0){ streak = 0 } streak += 1 } 2 -> { // 連勝中の場合は値を0に戻す if(streak > 0){ streak = 0 } streak -= 1 resultLabel.setText(R.string.result_lose) // 負けた場合 } } // TODO: プログラム終了。何がしたいか、NEXTの遷移先を変えたい?それとも表示を変えたい? if(streak >= 3 || streak <= -3){ Log.d("TEST", "ゲーム終了") } nextButton.setOnClickListener { val intent = Intent(this, MainActivity::class.java) intent.putExtra("streak", streak) // TODO: Activityが積まれ続けるのを回避。画面の構成を考える必要があれば修正する intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) } saveData(myHand, comHand ,gameResult) } private fun saveData(myHand: Int, comHand: Int, gameResult: Int) { val pref = PreferenceManager.getDefaultSharedPreferences(this) val gameCount = pref.getInt("GAME_COUNT", 0) val winningStreakCount = pref.getInt("WINNING_STREAK_COUNT", 0) val lastComHand = pref.getInt("LAST_COM_HAND", 0) val lastGameResult = pref.getInt("GAME_RESULT", -1) val edtWinningStreakCount: Int = when { lastGameResult == 2 && gameResult == 2 -> winningStreakCount + 1 else -> 0 } val editor = pref.edit() pref.edit { putInt("GAME_COUNT", gameCount + 1) putInt("WINNING_STREAK_COUNT", edtWinningStreakCount) putInt("LAST_MY_HAND", myHand) putInt("LAST_COM_HAND", comHand) putInt("BEFORE_LAST_COM_HAND", lastComHand) putInt("GAME_RESULT", gameResult) } } private fun getHand(): Int { var hand = (Math.random() * 3).toInt() val pref = PreferenceManager.getDefaultSharedPreferences(this) val gameCount = pref.getInt("GAME_COUNT", 0) val winningStreakCount = pref.getInt("WINNING_STREAK_COUNT", 0) val lastMyHand = pref.getInt("LAST_MY_HAND", 0) val lastComHand = pref.getInt("LAST_COM_HAND", 0) val beforeLastComHand = pref.getInt("BEFORE_LAST_COM_HAND", 0) val gameResult = pref.getInt("GAME_RESULT", -1) if (gameCount == 1) { if (gameResult == 2) { // 前回の勝負が1回目で、コンピュータが勝った場合、 // コンピュータは次に出す手を変える while (lastComHand == hand) { hand = (Math.random() * 3).toInt() } } else if (gameResult == 1) { // 前回の勝負が1回目で、コンピュータが負けた場合 // 相手の出した手に勝つ手を出す hand = (lastMyHand - 1 + 3) % 3 } } else if (winningStreakCount > 0) { if (beforeLastComHand == lastComHand) { // 同じ手で連勝した場合は手を変える while (lastComHand == hand) { hand = (Math.random() * 3).toInt() } } } return hand } }
コード///activity_main.xml/// <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout android:layout_height="match_parent" android:layout_width="match_parent" 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"> <ImageButton android:id="@+id/choki" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:scaleType="fitCenter" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/choki" /> <ImageButton android:id="@+id/pa" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginStart="8dp" android:scaleType="fitCenter" app:layout_constraintStart_toEndOf="@+id/choki" app:layout_constraintTop_toTopOf="@+id/choki" app:srcCompat="@drawable/pa" /> <ImageButton android:id="@+id/gu" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginEnd="8dp" android:scaleType="fitCenter" app:layout_constraintEnd_toStartOf="@+id/choki" app:layout_constraintTop_toTopOf="@+id/choki" app:srcCompat="@drawable/gu" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="@string/janken_text" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBottom_toTopOf="@+id/choki" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>

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

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

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

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

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

guest

回答2

0

ベストアンサー

連勝、連敗判定のところでvisibilityで表示、非表示を変えるとできるかと思います。

// ResultAcitivity.java // TODO: プログラム終了。何がしたいか、NEXTの遷移先を変えたい?それとも表示を変えたい? // 結果は非表示 irasutoyabad_png.visibility = View.INVISIBLE if(streak >= 3){ // 3連勝以上のときirasutoyahappyを表示 irasutoyabad_png.visibility = View.VISIBLE irasutoyabad_png.setImageResource(R.drawable.irasutoyahappy) }else if(streak <= -3){ // 3連敗以上のときirasutoyahappyを非表示 irasutoyabad_png.visibility = View.VISIBLE irasutoyabad_png.setImageResource(R.drawable.irasutoyahappy) }

「"次へ"というボタンをじゃんけんが終わるごとに表示したいです。」と言う質問に対してですが
現在、ResultAcitivityでじゃんけんの結果が出るごとに次へボタンが出ているかと思いますが「終わるごとに」とは何を指していますでしょうか?

===追記

xmlの内容を変えた場合は参照できなくなります。(記載されているresult_activty.xmlが変更されているようなので)
「Unresolved reference: irasutoyabad_png」これはirasutoyabad_pngが何かわからない、と言うエラーです。
android:id="@+id/irasutoyabad.png"のid部分を変えたのであればそれに応じて変更してください。

visibilityで表示、非表示を変えると言う手法が分かっていれば現状書かれている方法で対応できるかと思います。
現在は連勝や連敗でやっているので単純に加算していくパターンが欲しい場合には勝ちと負けを用意して単純に加算していった値を渡すように変更すれば良いです。

===追記
>・irasutoyahappyの画像が勝敗に関わらず常に表示される
>→razumaさんが書いてくれたコードをresult_activityに貼り付けたのですがそれだけではだめなのでし>ょうか?設定の方法が別にあれば教えていただきたいです。

→そのまま貼るのも良いのですが、書かれたコードの意味を考えてください。

最初に書いたいただいたコードにはirasutoyabad_pngしかなかったのでそれを最初に非表示にしておいて3連勝、または3連敗したときに表示させるようなコードを書きました(今見ると誤っていて下の方はirasutoyabad_png.setImageResource(R.drawable.irasutoyabad)とするべきでした)
これは1つのviewに対して表示を変えているので今あるxmlでいくと、happyとbadの2つ用意されていてそれを表示、非表示させたいのだと思いますので以下のようにするととりあえず動くかと思います。

// ResultAcitivity.java // TODO: プログラム終了。何がしたいか、NEXTの遷移先を変えたい?それとも表示を変えたい? // 結果は非表示 irasutoyahappy.visibility = View.INVISIBLE irasutoyabad.visibility = View.INVISIBLE if(streak >= 3){ // 3連勝以上のときirasutoyahappyを表示 irasutoyahappy.visibility = View.VISIBLE } if(streak <= -3){ // 3連敗以上のときirasutoyabadを表示 irasutoyabad.visibility = View.VISIBLE }

streakには、現在連勝や連敗が入っていると思うので単純に3回勝ったら or 3回負けたらにしたいのであればintentで渡している値などを単純な勝ち負けの積み上げなどにしてやるなどが必要になるかと思います。

以上、よろしくお願いいたします。

投稿2020/12/20 16:25

編集2020/12/23 09:46
razuma

総合スコア1313

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

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

htnk_4a

2020/12/21 08:24

実行してみたのですが、 Unresolved reference: irasutoyabad_png というエラーメッセージが出ます。。
htnk_4a

2020/12/22 14:10

昨日から試行錯誤してみましたが、エラーの件は解決しました!しかし、 ・irasutoyahappyの画像が下に配置しているのにも関わらず実行時戻るボタンと重複するように表示される。 ・irasutoyahappyの画像が勝敗に関わらず常に表示される。 ・irasutoyabad_pngの画像が一度も表示されない の問題点が出てきて自力で解決できませんでした。よろしくお願いします。
razuma

2020/12/22 15:01

・irasutoyahappyの画像が下に配置しているのにも関わらず実行時戻るボタンと重複するように表示される。 →レイアウトがtools:layout_editor_absoluteX、tools:layout_editor_absoluteYなどで設定されていないかをxmlのcodeで確認してください。この値はレイアウト画面上でそう見えているだけで実際には意味のない設定値です、消してください。レイアウトをする際にはコードで書きましょう。 ・irasutoyahappyの画像が勝敗に関わらず常に表示される。 →回答のようにView.INVISIBLEを設定しましたでしょうか?これはレイアウトを非表示にする設定です。設定しているのであれば条件分岐が間違っていますのでどのように書いているかを教えてください。 ・irasutoyabad_pngの画像が一度も表示されない →よくわかりません。irasutoyabad_pngはirasutoyabadとは違うものでしょうか?編集した時の書き間違えで必要ないのではないでしょうか?
htnk_4a

2020/12/23 08:54

・irasutoyahappyの画像が下に配置しているのにも関わらず実行時戻るボタンと重複するように表示される。 →解決しました ・irasutoyahappyの画像が勝敗に関わらず常に表示される →razumaさんが書いてくれたコードをresult_activityに貼り付けたのですがそれだけではだめなのでしょうか?設定の方法が別にあれば教えていただきたいです。 ・irasutoyabad_pngの画像が一度も表示されない →irasutoyabadの間違えでした。すみません。この問題は二個目の問題を解決できればこの問題も解決しますか?
razuma

2020/12/23 09:46

回答追記しました。よろしくお願いいたします。
htnk_4a

2020/12/23 14:02

無事理想通り動かせることが出来ました!ご協力ありがとうございました!また機会があればよろしくお願いします。
razuma

2020/12/23 14:42

無事動いたようで何よりです。アプリ開発がんばってください。
guest

0

result_activty.xmlが質問に入らないのでこちらに失礼します。

コード <?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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ResultActivity"> <TextView android:id="@+id/resultLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:text="TextView" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:id="@+id/myHandImage" android:layout_width="160dp" android:layout_height="160dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:scaleType="fitCenter" app:layout_constraintBottom_toTopOf="@+id/resultLabel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/gu" /> <ImageView android:id="@+id/comHandImage" android:layout_width="130dp" android:layout_height="200dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:scaleType="fitCenter" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/resultLabel" app:srcCompat="@drawable/com_gu" /> <Button android:id="@+id/backButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="4dp" android:text="@string/back_text" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/nextButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="次へ" app:layout_constraintTop_toTopOf="parent" app:layout_constraintRight_toRightOf="parent" android:layout_marginEnd="16dp" android:layout_marginTop="4dp" /> <ImageView android:id="@+id/irasutoyahappy" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="fitCenter" app:srcCompat="@drawable/irasutoyahappy" tools:layout_editor_absoluteX="47dp" tools:layout_editor_absoluteY="584dp" /> <ImageView android:id="@+id/irasutoyabad" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="fitCenter" app:srcCompat="@drawable/irasutoyabad" tools:layout_editor_absoluteX="374dp" tools:layout_editor_absoluteY="584dp" /> </androidx.constraintlayout.widget.ConstraintLayout>

投稿2020/12/20 16:01

編集2020/12/21 08:26
htnk_4a

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問