質問: ### dialogflagmentからではactivityのsoundpoolは、鳴らせない? 注*解決方法はすでに見つかっているので、どうしても解決して欲しいというわけではない。 不具合の理由が知りたいだけなので、もしお暇があれば教えていただきたいという感じです。 --- 私は、dialogを作ったときいちいち`AudioAttributes.Builder()`,`SoundPool.Builder()`と`load()`やっていくのが面倒なので、activityで読み込んだ`soundpool`を使おうとしました。 流れとコードは以下の通りです。 流れ 1`activity`のダイアログ表示ボタンを押す。 2ダイアログ表示 3ダイアログの戻るボタンに`View.OnclickListener`を継承した`LogButtonClickListener`をつける。 4ダイアログの戻るボタンが押されたとき`LogButtonClickListener`を通して、押された`View`を把握。押された`View`が戻るボタンだったとき、その`View`をactivityの`onClick(v:View)`メソッドに渡す。 5activityの`onClick(v:View)`はそれが戻るボタンだったら`soundpool`を鳴らす。 6dialogの`dismiss`でdialogを消す。 ``` //dialogを表示するactivity class StoryActivity : FragmentActivity(),View.OnClickListener { //dialogで使われるメソッド。渡されるViewが戻るボタンの場合、つまりR.id.button_log_backの //場合、音を鳴らす。 override fun onClick(v: View?) { when(v){ findViewById(R.id.button_log_back)->{ soundPool!!.play(soundBack, 1.0f, 1.0f, 0, 0, 1f) } } } //省略 } ``` ``` class LogFragment : DialogFragment() { //戻るボタンにつけるリスナを定義。 //渡されるViewがR.id.button_log_backの場合、onclickにViewを渡す。 inner class LogButtonClickListener:View.OnClickListener{ override fun onClick(v: View?) { when(v){ dialog.findViewById(R.id.button_log_back)->{ val a =activity if (a is View.OnClickListener){ a.onClick(v)//ここで鳴るはずなのに・・・ dismiss() } } } } } //省略 override fun onActivityCreated(savedInstanceState: Bundle?) { //上で定義したリスナをつける。 dialog.findViewById(R.id.button_log_back).setOnClickListener(LogButtonClickListener()) } ``` これで戻るボタンを押すと`dismiss`はされるのですが、音は鳴りませんでした。(普通にactivityで鳴らす分には、鳴ることは確認済み) とまあ、面倒を避けようとして逆に面倒なことになってしまい、はっきりいって大失敗しました。 しかしかなり長い時間をかけて考えたので、せっかくだから鳴らない原因を知りたいと思いました。 これはなぜ鳴らないのでしょうか? また、activityのsoundpoolを使うというのは、やはりよろしくないアプローチなのでしょうか? ご暇があれば、ぜひ教えていただいたきたいと思います・・・よろしくお願いします。
回答: onClick内のwhen節の処理がおかしいようです。 Viewが一致するかではなく、idが一致するかで判定を行いましょう。 ``` when (v.id) { R.id.button_log_back -> { ... } } ``` ちなみにご質問のコードが動かないのは、DialogがActivityとは別のWindowを生成して利用するためです。ActivityのfindViewByIdメソッドではDialog内のViewを取得することはできません。