Selain dapat menggantikan peran activity sebagai UI, fragment juga dapat digunakan sebagai form dialog.
Langkah Kerjanya adalah sebagai berikut.
- Buat kembali satu kelas fragment dengan nama OptionDialogFragment

- Ketika pada file fragment_option_dialog.xml kondisikan kodenya menjadi seperti berikut:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".OpenDialogFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/pertanyaan" />
<RadioGroup
android:id="@+id/rg_options"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
android:id="@+id/rb_br"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/brendan_rodgers" />
<RadioButton
android:id="@+id/rb_poc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/mouricio_pochettino" />
<RadioButton
android:id="@+id/rb_rang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/ralf_rangnick" />
<RadioButton
android:id="@+id/rb_hag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/erik_ten_hag" />
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_close"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="0.5"
android:text="@string/tutup" />
<Button
android:id="@+id/btn_choose"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_weight="0.5"
android:text="@string/pilih" />
</LinearLayout>
</LinearLayout>- Setelah selesai dengan berkas layout xml, lanjutkan ngoding untuk OptionDialogFragment. Pertama, kenalkan obyek yang ada di dalam layout seperti ini:
private lateinit var btnChoose: Button
private lateinit var btnClose: Button
private lateinit var rgOptions: RadioGroup
private lateinit var rbBr: RadioButton
private lateinit var rbPoc: RadioButton
private lateinit var rbRang: RadioButton
private lateinit var rbHag: RadioButton
private var optionDialogListener: OnOptionDialogListener? = null
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btnChoose = view.findViewById(R.id.btn_choose)
btnClose = view.findViewById(R.id.btn_close)
rgOptions = view.findViewById(R.id.rg_options)
rbBr = view.findViewById(R.id.rb_br)
rbPoc = view.findViewById(R.id.rb_poc)
rbRang = view.findViewById(R.id.rb_rang)
rbHag = view.findViewById(R.id.rb_hag)
}Selanjutnya kita beri aksi untuk button-nya dan beri pula kelas interface dan ubah turunannya dari Fragment menjadi DialogFragment.
class OptionDialogFragment : DialogFragment(){
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
...
btnChoose.setOnClickListener {
val checkedRadioButtonId = rgOptions.checkedRadioButtonId
if (checkedRadioButtonId != -1) {
var coach: String? = null
when (checkedRadioButtonId) {
R.id.rb_br -> coach = rbBr.text.toString().trim()
R.id.rb_poc -> coach = rbPoc.text.toString().trim()
R.id.rb_rang -> coach = rbRang.text.toString().trim()
R.id.rb_hag -> coach = rbHag.toString().trim()
}
optionDialogListener?.onOptionChosen(coach)
dialog?.dismiss()
}
}
btnClose.setOnClickListener {
dialog?.cancel()
}
}
interface OnOptionDialogListener {
fun onOptionChosen(text: String?)
}
}Kemudian tambahkan kode berikut untuk mengelola optionDialogListenerketika fragment dipanggil dan dimatikan:
override fun onAttach(context: Context) {
super.onAttach(context)
val fragment = parentFragment
if (fragment is DetailCategoryFragment) {
this.optionDialogListener = fragment.optionDialogListener
}
}
override fun onDetach() {
super.onDetach()
this.optionDialogListener = null
}Sehingga seluruh kode pada OptionDialogFragment menjadi sebagai berikut:
class OptionDialogFragment : DialogFragment(){
private lateinit var btnChoose: Button
private lateinit var btnClose: Button
private lateinit var rgOptions: RadioGroup
private lateinit var rbBr: RadioButton
private lateinit var rbPoc: RadioButton
private lateinit var rbRang: RadioButton
private lateinit var rbHag: RadioButton
private var optionDialogListener: OnOptionDialogListener? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_option_dialog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btnChoose = view.findViewById(R.id.btn_choose)
btnClose = view.findViewById(R.id.btn_close)
rgOptions = view.findViewById(R.id.rg_options)
rbBr = view.findViewById(R.id.rb_br)
rbPoc = view.findViewById(R.id.rb_poc)
rbRang = view.findViewById(R.id.rb_rang)
rbHag = view.findViewById(R.id.rb_hag)
btnChoose.setOnClickListener {
val checkedRadioButtonId = rgOptions.checkedRadioButtonId
if (checkedRadioButtonId != -1) {
var coach: String? = null
when (checkedRadioButtonId) {
R.id.rb_br -> coach = rbBr.text.toString().trim()
R.id.rb_poc -> coach = rbPoc.text.toString().trim()
R.id.rb_rang -> coach = rbRang.text.toString().trim()
R.id.rb_hag -> coach = rbHag.toString().trim()
}
optionDialogListener?.onOptionChosen(coach)
dialog?.dismiss()
}
}
btnClose.setOnClickListener {
dialog?.cancel()
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
val fragment = parentFragment
if (fragment is DetailCategoryFragment) {
this.optionDialogListener = fragment.optionDialogListener
}
}
override fun onDetach() {
super.onDetach()
this.optionDialogListener = null
}
interface OnOptionDialogListener {
fun onOptionChosen(text: String?)
}
}Ingat, jangan lupa untuk menambahkan inherit ke kelas DialogFragment.
- Tambahkan Objek btnShowDialog dan method onViewCreated pada DetailCategoryFragment sehingga menjadi sebagai berikut:
class DetailCategoryFragment : Fragment() {
lateinit var btnShowDialog: Button
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_detail_category, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btnShowDialog = view.findViewById(R.id.btn_show_dialog)
}
}- Tambahkan beberapa baris pada metode onViewCreated di DetailCategoryFragment, sehingga menjadi sebagai berikut:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
...
btnShowDialog.setOnClickListener{
val mOptionDialogFragment = OptionDialogFragment()
val mFragmentManager = childFragmentManager
mOptionDialogFragment.show(mFragmentManager, OptionDialogFragment::class.java.simpleName)
}
}- Kemudian tambahkan OptionDialogFragment pada DetailCategoryFragment seperti berikut:
class DetailCategoryFragment : Fragment(), View.OnClickListener {
...
internal var optionDialogListener: OptionDialogFragment.OnOptionDialogListener = object : OptionDialogFragment.OnOptionDialogListener {
override fun onOptionChosen(text: String?) {
Toast.makeText(activity, text, Toast.LENGTH_SHORT).show()
}
}
}- Sehingga kode DetailCategoryFragment kita saat ini menjadi seperti ini:
class DetailCategoryFragment : Fragment() {
lateinit var btnShowDialog: Button
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_detail_category, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btnShowDialog = view.findViewById(R.id.btn_show_dialog)
btnShowDialog.setOnClickListener{
val mOptionDialogFragment = OptionDialogFragment()
val mFragmentManager = childFragmentManager
mOptionDialogFragment.show(mFragmentManager, OptionDialogFragment::class.java.simpleName)
}
}
internal var optionDialogListener: OptionDialogFragment.OnOptionDialogListener = object : OptionDialogFragment.OnOptionDialogListener {
override fun onOptionChosen(text: String?) {
Toast.makeText(activity, "Anda Memilih : " +text, Toast.LENGTH_SHORT).show()
}
}
}- Sekarang jalankan kembali aplikasi dan klik pada tombol Tampilkan sebuah dialog. Hasilnya akan muncul obyek OptionDialogFragment yang baru saja dibuat. Coba Anda pilih salah satu option yang ada dan klik tombol Pilih. Lihat, hasil dari yang kita pilih, tampil dalam bentuk soft message (Toast).
![]() | ![]() |

