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

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

ただいまの
回答率

88.80%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 577

hood

score 341

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を消す。

//dialogを表示するactivity
class StoryActivity : FragmentActivity(),View.OnClickListener {
  //dialogで使われるメソッド。渡されるViewが戻るボタンの場合、つまりR.id.button_log_backの
  //場合、音を鳴らす。
    override fun onClick(v: View?) {
        when(v){
            findViewById<Button>(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<Button>(R.id.button_log_back)->{
                   val a =activity
                   if (a is View.OnClickListener){
                       a.onClick(v)//ここで鳴るはずなのに・・・
                       dismiss()
                   }
               }

           }
        }
    }
   //省略
    override fun onActivityCreated(savedInstanceState: Bundle?) {
    //上で定義したリスナをつける。
        dialog.findViewById<Button>(R.id.button_log_back).setOnClickListener(LogButtonClickListener())
    }


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

when (v.id) {
    R.id.button_log_back -> {
        ...
    }
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 15:06

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

    キャンセル

  • 2019/01/18 15:27

    回答では修正箇所が少なくすむようにidで判定する方針で書きましたが、OnClickListenerはinner classで定義せず、Viewごとに定義して設定するとベターだと思います。idの判定が要らなくなります 🙂

    override fun onActivityCreated(savedInstanceState: Bundle?) {
    dialog.findViewById<Button>(R.id.button_log_back).setOnClickListener {
    // activityに通知...
    }
    }

    キャンセル

  • 2019/01/18 15:49

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

    キャンセル

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る