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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

Q&A

解決済

1回答

1357閲覧

dialogflagmentからではactivityのsoundpoolは、鳴らせない?

hood

総合スコア351

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

0グッド

0クリップ

投稿2019/01/18 05:19

###dialogflagmentからではactivityのsoundpoolは、鳴らせない?

注*解決方法はすでに見つかっているので、どうしても解決して欲しいというわけではない。
不具合の理由が知りたいだけなので、もしお暇があれば教えていただきたいという感じです。


私は、dialogを作ったときいちいちAudioAttributes.Builder(),SoundPool.Builder()load()やっていくのが面倒なので、activityで読み込んだsoundpoolを使おうとしました。
流れとコードは以下の通りです。

流れ
1activityのダイアログ表示ボタンを押す。
2ダイアログ表示
3ダイアログの戻るボタンにView.OnclickListenerを継承したLogButtonClickListenerをつける。
4ダイアログの戻るボタンが押されたときLogButtonClickListenerを通して、押されたViewを把握。押されたViewが戻るボタンだったとき、そのViewをactivityのonClick(v:View)メソッドに渡す。
5activityのonClick(v:View)はそれが戻るボタンだったらsoundpoolを鳴らす。
6dialogのdismissでdialogを消す。

kotlin

1//dialogを表示するactivity 2class StoryActivity : FragmentActivity(),View.OnClickListener { 3  //dialogで使われるメソッド。渡されるViewが戻るボタンの場合、つまりR.id.button_log_backの 4  //場合、音を鳴らす。 5 override fun onClick(v: View?) { 6 when(v){ 7 findViewById<Button>(R.id.button_log_back)->{ 8 soundPool!!.play(soundBack, 1.0f, 1.0f, 0, 0, 1f) 9 } 10 } 11 } 12 //省略 13}

kotlin

1 2class LogFragment : DialogFragment() { 3  //戻るボタンにつけるリスナを定義。 4  //渡されるViewがR.id.button_log_backの場合、onclickにViewを渡す。 5 inner class LogButtonClickListener:View.OnClickListener{ 6 override fun onClick(v: View?) { 7 when(v){ 8 dialog.findViewById<Button>(R.id.button_log_back)->{ 9 val a =activity 10 if (a is View.OnClickListener){ 11 a.onClick(v)//ここで鳴るはずなのに・・・ 12 dismiss() 13 } 14 } 15 16 } 17 } 18 } 19 //省略 20 override fun onActivityCreated(savedInstanceState: Bundle?) { 21    //上で定義したリスナをつける。 22 dialog.findViewById<Button>(R.id.button_log_back).setOnClickListener(LogButtonClickListener()) 23 } 24

これで戻るボタンを押すとdismissはされるのですが、音は鳴りませんでした。(普通にactivityで鳴らす分には、鳴ることは確認済み)

とまあ、面倒を避けようとして逆に面倒なことになってしまい、はっきりいって大失敗しました。
しかしかなり長い時間をかけて考えたので、せっかくだから鳴らない原因を知りたいと思いました。
これはなぜ鳴らないのでしょうか?
また、activityのsoundpoolを使うというのは、やはりよろしくないアプローチなのでしょうか?

ご暇があれば、ぜひ教えていただいたきたいと思います・・・よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

onClick内のwhen節の処理がおかしいようです。
Viewが一致するかではなく、idが一致するかで判定を行いましょう。

kotlin

1when (v.id) { 2 R.id.button_log_back -> { 3 ... 4 } 5}

ちなみにご質問のコードが動かないのは、DialogがActivityとは別のWindowを生成して利用するためです。ActivityのfindViewByIdメソッドではDialog内のViewを取得することはできません。

投稿2019/01/18 06:02

kakajika

総合スコア3131

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

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

hood

2019/01/18 06:06

回答ありがとうございます! なるほど、idで一致を確かめるという発想はなかったです・・・ 「ActivityのfindViewByIdメソッドではDialog内のViewを取得することができない」というのも、知りませんでした・・・ 教えていただいたことをとりいれ、もう少し諦めず、粘ってみようかと思います! 返す返す、ありがとうございました!
kakajika

2019/01/18 06:27

回答では修正箇所が少なくすむようにidで判定する方針で書きましたが、OnClickListenerはinner classで定義せず、Viewごとに定義して設定するとベターだと思います。idの判定が要らなくなります ???? override fun onActivityCreated(savedInstanceState: Bundle?) { dialog.findViewById<Button>(R.id.button_log_back).setOnClickListener { // activityに通知... } }
hood

2019/01/18 06:49

確かに言われてみればそっちのほうがよさそうですね・・・ 教えていただくごとになるほどと、膝をうつばかりです。 よりよい方法まで教えてくださり、本当にありがとうございます! 早速そっちの方向で試してみたいと思います!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問