rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ダイアログを開く

2021 Oct. 31.

MainActivity.kt

class MainActivity : AppCompatActivity() {

    // Bundleを利用してデータを渡す
    val str1 = "ab"
    val int1 = 12
    val args = Bundle()
    args.putString("String1", str1)
    args.putInt("Integer1", int1)

    // DialogFragmentのインスタンスはshow()を実行する処理部のローカル変数とする。
    // グローバル変数にするとメモリリークの原因となる。
    val myDialogFragment = MyDialogFragment()
    myDialogFragment.setArguments(args)

    // ダイアログを開く
    myDialogFragment.show(supportFragmentManager, "simple")
}


MyDialogFragment.kt

class MyDialogFragment: DialogFragment()  {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        val inflater = requireActivity().layoutInflater
        val myDialogView = inflater.inflate(R.layout.my_dialog, null)

        // Dialog上のEditTextオブジェクトを取得する
        val editTextStr1 = myDialogView.findViewById<EditText>(R.id.editTextStr1)
        val editTextInt1 = myDialogView.findViewById<EditText>(R.id.editTextInt1)

        // 呼び出し元でBundleにセットした値を取得し、Viewにセットする
        editTextStr1.setText(requireArguments().getString("String1", ""))
        editTextInt1.setText(requireArguments().getInt("Integer1", 0).toString())

        builder.setView(myDialogView)
            .setTitle("My Dialog")
            .setPositiveButton("OK") { dialog, id ->
                // codes to do
            }
            .setNegativeButton("Cancel") { dialog, id ->
                // nothing is done
            }

        return builder.create().also { dialog ->  // dialogを返すと共に、dialogのOnShowでボタンオブジェクト取得し、必要な処理をセットする
            dialog.setOnShowListener({
                val button = dialog.getButton(Dialog.BUTTON_POSITIVE)
                // codes to do
            })
        }
    }
}