1
1

More than 3 years have passed since last update.

Kotlinでカスタムしたダイアログからコールバックを受ける

Posted at

レイアウトをカスタムしたダイアログからコールバックを受ける

・自分で作ったレイアウトをダイアログアラートに適応します。
・ダイアログでOKボタンが押されたら、メインアクティビティでコメントをprintlnします。

MainActivity.kt
//ダイアログ側で設定したインターフェースを実装
class MainActivity : AppCompatActivity(), TestDialogFragment.TestDialogListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //ダイアログの起動ボタン
        val btn = findViewById<Button>(R.id.button)
        btn.setOnClickListener {
            //カスタムダイアログを起動
            val dialog = TestDialogFragment()
            dialog.show(supportFragmentManager,"test")
        }
    }

    //ダイアログのコールバック
    override fun onDialogPositivClick(dialog: DialogFragment) {
        println("カスタムダイアログでokボタンが押されました。")
    }
}

次にカスタムしたダイアログフラグメント用のクラスファイルを作成します。

TestDialogFragment
//カスタムダイアログフラグメント
class TestDialogFragment : DialogFragment() {

    //コールバックするためのインターフェース
    interface TestDialogListener{
        fun onDialogPositivClick(dialog: DialogFragment)
    }
    var mListener:TestDialogListener? = null

    //ダイアログを生成
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = Dialog(requireContext())
        val dw = dialog.window
        dw?.let {
            it.requestFeature(Window.FEATURE_NO_TITLE)
            it.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
            )
            it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));
        }

        //自作したダイアログのカスタムレイアウトをセット
        dialog.setContentView(R.layout.customdialoglayout)

        //ダイアログのOKボタンのクリックリスナー
        val ok_btn = dialog.findViewById<Button>(R.id.ok)
        ok_btn.setOnClickListener {
            //メインアウティビティのコールバックを呼ぶ
            mListener?.onDialogPositivClick(this)
        }
        return dialog
    }


    //メインアクティビティをキャスト
    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            mListener = context as TestDialogListener
        } catch (e: ClassCastException) {
            Log.e("test", "ホストアクティビティにインターフェースが実装されていません。")
        }
    }
}

ダイアログのレイアウトはこのコードでいうと、
R.layout.customdialoglayout
にあたります。
適当に作成してください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1