###DialogFlagmentからActivityのメソッドを使うとヌルポが起きる。
私はアラートダイアログを出現させたときactivityの他のボタンを押せなくしたく、ダイアログを出現させたらfindViewById<Button>.isEnabled
でfalse、ダイアログのOKボタンを押したらfindViewById<Button>.isEnabled
でtrueでもとに戻る処理を実装したいと思いました。
kotlin
1//アラートダイアログ 2class Alert : DialogFragment() { 3・・・・ 4 /*ボタンリスナ*/ 5 inner class DialogButtonClickListener : DialogInterface.OnClickListener{ 6 //クリック時に呼び出される。l 7 override fun onClick(dialog: DialogInterface?, which: Int) { 8 val a = TitleActivity() 9 a.onAlertClick(which) 10 } 11 } 12・・・・ポジティブボタンに、このリスナーをつける。 13}
kotlin
1//Alertを使う、activity 2class TitleActivity : ..., DialogInterface.OnClickListener{ 3・・・ 4//dialogから使われるメソッド 5 fun onAlertClick(which: Int){ 6 when(which){ 7 DialogInterface.BUTTON_POSITIVE -> {//okを押されたら、ボタンを使えるようにする。 8 findViewById<Button>(R.id.button_start).isEnabled=true //しかしヌルポ 9 } 10 } 11 } 12・・・ 13} 14
しかし、タイトルにも書いたようにこのメソッドを使おうとすると、findViewById<Button(R.id.button_start).isEnabled=true
でヌルポが起きてしまいます。ですのでfindViewByIdだけの問題ではなく、TitleActivityの変数にアクセスできないということだと思います。
また、findViewById
だけではありません。
soundpool
を使い、音を鳴らそうとするとそれもヌルポになってしまいます。
kotlin
1 fun onAlertClick(which: Int){ 2 when(which){ 3 DialogInterface.BUTTON_POSITIVE -> { 4 soundPool!!.play(soundGo, 1.0f, 1.0f, 0, 0, 1f) //ヌルポ 5 } 6 } 7 }
ひるがえって、このactivityでは、もう一つ別のダイアログもあるのですが、そちらではactivityに継承させたDialogInterface.OnClickListener
のonClick
メソッドをoverrideし、それをDialogから使っています。そうするとなぜか上記のようなヌルポは起きません。
kotlin
1//もう一つのダイアログ。 2class StoryConfirm : DialogFragment() { 3・・・ 4 inner class DialogButtonClickListener : DialogInterface.OnClickListener{ 5 override fun onClick(dialog: DialogInterface?, which: Int) { 6 val a = activity 7 if (a is DialogInterface.OnClickListener) { 8 a.onClick(dialog, which) 9 } 10 } 11 } 12・・・ポジティブボタンに、このリスナーをつける。 13}
kotlin
1//上にでてきたのと同じactivity 2class TitleActivity : ..., DialogInterface.OnClickListener{ 3・・・ 4//Alertから使われるメソッド 5 fun onAlertClick(which: Int){ 6 when(which){ 7 DialogInterface.BUTTON_POSITIVE -> {//okを押されたら、ボタンを使えるようにする。 8 findViewById<Button>(R.id.button_start).isEnabled=true //しかしヌルポ 9 } 10 } 11 } 12 //DialogInterface.OnClickListenerのonClickをoverrideしたもの。StoryConfirmから使う 13 override fun onClick(dialog: DialogInterface?, which: Int) { 14 when(which){ 15 DialogInterface.BUTTON_POSITIVE->{ 16 soundPool!!.play(soundGo, 1.0f, 1.0f, 0, 0, 1f)//使える 17 findViewById<Button>(R.id.button_start).isEnabled=true//使える 18 } 19 } 20 } 21・・・ 22} 23
この違いはなぜ起きるのでしょう?DialogInterface.OnClickListener
のonClick
をoverride
しただけで、それ以外に違いはないように見えるのですが・・・またどうすればAlert
から使われるメソッドのほうでヌルポを回避できるのか・・・
どうかアドバイスいただけたら幸いです...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/28 00:28 編集
2019/02/28 00:52 編集