a-2-5.モーダル表示(DialogFragment)
目標設定
課題
- DialogFragmentを利用してダイアログを表示できるか。
- DialogFragmentからActivityへ入力内容を共有できるか。
Github
テスト実装
DialogFragmentTestActivity.kt
class DialogFragmentTestActivity : AppCompatActivity(), View.OnClickListener,
DialogFragmentTestFragment.DialogListener {
private lateinit var displayButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dialog_fragment_test)
// 1. DialogFragmentを利用してダイアログを表示できるか。
// ・可能でした。
displayButton = findViewById(R.id.displayButton)
displayButton.setOnClickListener(this)
}
override fun onClick(view: View){
when (view.id) {
R.id.displayButton -> {
val dialogFragment = DialogFragmentTestFragment()
dialogFragment.listener = this
dialogFragment.show(supportFragmentManager, "dialog_fragment_test_dialog")
}
}
}
// 2. DialogFragmentからActivityへ入力内容を共有できるか。
// ・可能でした。
override fun onDialogPositive(dialog: DialogFragment) {
Log.d("Dialog表示(Activity)", "OKボタン押下")
}
override fun onDialogNegative(dialog: DialogFragment) {
Log.d("Dialog表示(Activity)", "キャンセルボタン押下")
}
override fun onDialogNeutral(dialog: DialogFragment) {
Log.d("Dialog表示(Activity)", "あとでボタン押下")
}
}
activity_dialog_fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="23dp"
android:layout_marginEnd="23dp"
android:layout_marginTop="23dp"
android:layout_marginBottom="23dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal"
tools:ignore="UselessParent">
<Button
android:id="@+id/displayButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="画面遷移"
tools:ignore="HardcodedText" />
<Space
android:layout_width="30dp"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
DialogFragmentTestFragment.kt
class DialogFragmentTestFragment: DialogFragment() {
interface DialogListener {
fun onDialogPositive(dialog: DialogFragment)
fun onDialogNegative(dialog: DialogFragment)
fun onDialogNeutral(dialog: DialogFragment)
}
var listener: DialogListener? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(activity)
builder.setTitle("タイトル!")
.setMessage("ダイアログのメッセージです。")
.setPositiveButton("OK") { _, _ ->
listener?.onDialogPositive(this)
Log.d("Dialog表示", "OKボタン押下")
}
.setNegativeButton("キャンセル") { _, _ ->
listener?.onDialogNegative(this)
Log.d("Dialog表示", "キャンセルボタン押下")
}
.setNeutralButton("あとで") { _, _ ->
listener?.onDialogNeutral(this)
Log.d("Dialog表示", "あとでボタン押下")
}
return builder.create()
}
// override fun onAttach(context: Context) {
// super.onAttach(context)
// try {
// listener = context as DialogListener
// }catch (e: Exception){
// Log.e("Dialog表示","ダイアログの表示に失敗しました。")
// }
// }
//
// override fun onDetach() {
// super.onDetach()
// listener = null
// }
}