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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

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

Kotlin

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

Q&A

解決済

1回答

1248閲覧

AndroidstudioでMediaplayerを画面遷移したあと停止したい

narumisaito

総合スコア12

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2019/07/11 02:00

編集2019/07/14 04:33

前提・実現したいこと

アプリ製作初心者です。「はじめてのAndroidプログラミング第3版」という教材を読みながらandroid studioでじゃんけん目覚ましアプリ(設定した時間になったあとじゃんけんに勝てばアラームが停止する)を作成しています。

じゃんけんに勝った場合Mediaplayerを停止したいのですが、いい停止方法がわかりません。
停止方法を教えていただければ幸いです。

試したこと

アラームをセットした時間になるとJankenActivityの画面に移りMediaplayerが実行されます。さらにJankenButtonをタップするとJankenResultActivityの画面へ移るようになっています。

JankenResultActivityでgameResultの結果が1の場合、player.stop()で停止しようとすると音楽は停止するのですが、showメソッドが呼び出されなくなりダイアログが表示されなくなってしまいます。

JankenResultActivity

1 2val gameResult = (comHand - myHand + 3) % 3 3 when(gameResult) { 4 0 -> resultLabel.setText("あいこ!") 5 1 -> resultLabel.setText(" あなたの勝ち!") 6 2 -> resultLabel.setText("コンピュータの勝ち!") 7 } 8 9 when(gameResult) { 10 0 -> resultLabel1.setText("アラームを続けるよ") 11 1 -> resultLabel1.setText(" アラームを停止するよ") 12 2 -> resultLabel1.setText("アラームを続けるよ") 13 } 14 15 val dialog = SimpleAlertDialog() 16 17//音は停止するがshowメソッドが呼び出されない 18 when(gameResult) { 19 1 -> dialog.show(supportFragmentManager, "alert_dialog") 20 } 21 22 when(gameResult) { 23 1 -> player.stop() 24 }

該当のソースコード

kotlin

1class JankenActivity : AppCompatActivity() { 2 3 private lateinit var player: MediaPlayer 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_janken) 8 9 gu.setOnClickListener { onJankenButtonTapped(it) } 10 choki.setOnClickListener { onJankenButtonTapped(it) } 11 pa.setOnClickListener { onJankenButtonTapped(it) } 12 13 player = MediaPlayer.create(this, R.raw.bellsound) 14 player.isLooping = true 15 player.start() 16 17 } 18 19 fun onJankenButtonTapped(view: View?) { 20 21 val intent = Intent(this, JankenResultActivity::class.java) 22 intent.putExtra("MY_HAND", view?.id) 23 startActivity(intent) 24 } 25} 26

kotlin

1class JankenResultActivity : AppCompatActivity() { 2 3 val gu = 0 4 val choki = 1 5 val pa = 2 6 7 private lateinit var player: MediaPlayer 8 9 10 override fun onCreate(savedInstanceState: Bundle?) { 11 super.onCreate(savedInstanceState) 12 setContentView(R.layout.activity_janken_result) 13 val id = intent.getIntExtra("MY_HAND",0) 14 15 val myHand: Int 16 myHand = when (id) { 17 R.id.gu -> { 18 myHandImage.setImageResource(R.drawable.janken_gu) 19 gu 20 } 21 R.id.choki -> { 22 myHandImage.setImageResource(R.drawable.janken_choki) 23 choki 24 } 25 R.id.pa -> { 26 myHandImage.setImageResource(R.drawable.janken_pa) 27 pa 28 } 29 else -> pa 30 } 31 32 //コンピュータの手を決める 33 val comHand = (Math.random() * 3).toInt() 34 when(comHand) { 35 gu -> comHandImage.setImageResource(R.drawable.image_gu) 36 choki -> comHandImage.setImageResource(R.drawable.image_choki) 37 pa -> comHandImage.setImageResource(R.drawable.image_pa) 38 } 39 40 //勝敗を判定する 41 val gameResult = (comHand - myHand + 3) % 3 42 when(gameResult) { 43 0 -> resultLabel.setText("あいこ!") 44 1 -> resultLabel.setText(" あなたの勝ち!") 45 2 -> resultLabel.setText("コンピュータの勝ち!") 46 } 47 48 when(gameResult) { 49 0 -> resultLabel1.setText("アラームを続けるよ") 50 1 -> resultLabel1.setText(" アラームを停止するよ") 51 2 -> resultLabel1.setText("アラームを続けるよ") 52 } 53 54 val dialog = SimpleAlertDialog() 55 56//音は停止するがshowメソッドが呼び出されない 57 when(gameResult) { 58 1 -> dialog.show(supportFragmentManager, "alert_dialog") 59 } 60 61 when(gameResult) { 62 1 -> player.stop() 63 } 64 65 backButton.setOnClickListener { finish() } 66 } 67 68} 69

kotlin

1class MainActivity : AppCompatActivity() 2 , SimpleAlertDialog.OnClickListener 3 , DatePickerFragment.OnDateSelectedListener 4 , TimePickerFragment.OnTimeSelectedListener { 5 6 //ダイアログで設定したアラームを設定 7 override fun onSelected(year: Int, month: Int, date: Int) { 8 val c = Calendar.getInstance() 9 c.set(year, month, date) 10 dateText.text = DateFormat.format("yyyy/MM/dd", c) 11 } 12 13 override fun onSelected(hourOfDay: Int, minute: Int) { 14 timeText.text = "%1$02d:%2$02d".format(hourOfDay,minute) 15 } 16 17 override fun onPositiveClick() { 18 finish() 19 } 20 21 override fun onNegativeClick() { 22 val calender = Calendar.getInstance() 23 calender.timeInMillis = System.currentTimeMillis() 24 calender.add(Calendar.MINUTE, 5) 25 setAlarmManager(calender) 26 finish() 27 } 28 29 override fun onCreate(savedInstanceState: Bundle?) { 30 super.onCreate(savedInstanceState) 31 32 //スリープを解除して画面を表示する 33 if (intent?.getBooleanExtra("onReceive", false) == true) { 34 when { 35 Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> 36 window.addFlags(FLAG_TURN_SCREEN_ON or FLAG_SHOW_WHEN_LOCKED) 37 else -> 38 window.addFlags(FLAG_TURN_SCREEN_ON or FLAG_SHOW_WHEN_LOCKED or FLAG_DISMISS_KEYGUARD) 39 } 40 val dialog = SimpleAlertDialog() 41 dialog.show(supportFragmentManager, "alert_dialog") 42 } 43 44 45 setContentView(R.layout.activity_main) 46 47 setAlarm.setOnClickListener { 48 val date = "${dateText.text} ${timeText.text}".toDate() 49 when { 50 date != null -> { 51 val calender = Calendar.getInstance() 52 calender.time = date 53 setAlarmManager(calender) 54 toast("アラームをセットしました") 55 } 56 else -> { 57 toast("日付の形式が正しくありません") 58 } 59 } 60 } 61 canselAlarm.setOnClickListener { 62 cancelAlarmManager() 63 } 64 65 dateText.setOnClickListener { 66 val dialog = DatePickerFragment() 67 dialog.show(supportFragmentManager, "date_dialog") 68 } 69 70 timeText.setOnClickListener{ 71 val dialog = TimePickerFragment() 72 dialog.show(supportFragmentManager, "time_dialog") 73 } 74 } 75 76 77 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 78 private fun setAlarmManager(calendar: Calendar) { 79 val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager 80 val intent = Intent(this, AlarmBroadcastReceiver::class.java) 81 val pending = PendingIntent.getBroadcast(this, 0, intent, 0) 82 when { 83 Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> { 84 val info = AlarmManager.AlarmClockInfo( 85 calendar.timeInMillis, null) 86 am.setAlarmClock(info, pending) 87 } 88 Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> { 89 am.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pending) 90 } 91 else -> { 92 am.set(AlarmManager.RTC_WAKEUP, 93 calendar.timeInMillis, pending) 94 } 95 } 96 } 97 98 //アラームをキャンセル 99 private fun cancelAlarmManager() { 100 val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager 101 val intent = Intent(this, AlarmBroadcastReceiver::class.java) 102 val pending = PendingIntent.getBroadcast(this, 0, intent, 0) 103 am.cancel(pending) 104 } 105 106 fun String.toDate(pattern: String = "yyyy/MM/dd HH:mm"): Date? { 107 val sdFormat = try { 108 SimpleDateFormat(pattern) 109 }catch (e: IllegalArgumentException) { 110 null 111 } 112 val date = sdFormat?.let { 113 try { 114 it.parse(this) 115 } catch (e: ParseException){ 116 null 117 } 118 } 119 return date 120 } 121} 122

補足情報(FW/ツールのバージョンなど)

Android Studio 3.3.1
Kotlin 1.3.21

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

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

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

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

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

jimbe

2019/07/13 11:55

じゃんけんに勝った時, コードのどの部分を通ってアラームが停止するはずなのでしょうか. そして, 「鳴り続けて」いる場合は, どういうルートでコードが実行されているのでしょうか.
narumisaito

2019/07/14 04:36

文章に誤りがあり追記・修正いたしました。お手数おかけしますが再度確認いただければ幸いです。
guest

回答1

0

ベストアンサー

Activity の onCreate の段階ではまだ Activity の生成が完了していないため, ダイアログの表示は出来ないようです.

Displaying alerts in Activity.onCreate(..)

Activity の生成以外の処理は onStart で行っては如何でしょうか.

投稿2019/07/14 07:20

jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問