レイアウトをカスタムしたダイアログからコールバックを受ける
・自分で作ったレイアウトをダイアログアラートに適応します。
・ダイアログで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
にあたります。
適当に作成してください。