AndroidのDialogFragmentを利用したダイアログのonStart()にて、OKボタンがタップされた時のイベントが、初めてダイアログを開いた1回目にしか捕捉できません。
Logcatで状況を確認したコードは下記のものです。
キャンセルボタンでダイアログを閉じた後に再度ダイアログを表示した時など、2回目以降もOKボタンイベントを補足するにはどうすればよいでしょうか。
プログラムの目的は、ダイアログに置かれた2つのEditTextの入力が空でないことを確認してからダイアログを閉じるコードを書こうとしているものです。
https://code.luasoftware.com/tutorials/android/android-alertdialog-getbutton-null-pointer-exception/ を参考しました。
kotlinコード
class MyDialogFragment: DialogFragment() { lateinit var myDialog: AlertDialog lateinit var myDialogView: View private val okButton: Button by lazy { (myDialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE) } private val cancelButton: Button by lazy { (myDialog as AlertDialog).getButton(AlertDialog.BUTTON_NEGATIVE) } override fun onStart() { super.onStart() Log.d("MyApp", "Dialog: onStart") okButton.setOnClickListener { Log.d("MyApp", "Dialog:okButton OnClickListener") } cancelButton.setOnClickListener { myDialog.dismiss() } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val inflater = requireActivity().layoutInflater myDialogView = inflater.inflate(R.layout.my_dialog, null) val builder = AlertDialog.Builder(it) builder.setView(myDialogView) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null) myDialog = builder.create() myDialog } ?: throw IllegalStateException("Activity cannot be null") } }
Logcat出力
2021-10-24 11:39:37.418 11288-11288/PACKAGE D/MyApp: Dialog: onStart 2021-10-24 11:39:42.469 11288-11288/PACKAGE D/MyApp: Dialog:okButton OnClickListener 2021-10-24 11:39:47.494 11288-11288/PACKAGE D/MyApp: Dialog: onStart 2021-10-24 11:39:50.798 11288-11288/PACKAGE D/MyApp: Dialog: onStart 2021-10-24 11:39:53.470 11288-11288/PACKAGE D/MyApp: Dialog: onStart 2021-10-24 11:39:55.847 11288-11288/PACKAGE D/MyApp: Dialog: onStart
MainActivity
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import net.sytes.rokkosan.myalertdialog.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var viewBinding: ActivityMainBinding val myDialogFragment = MyDialogFragment() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // set View Binding viewBinding = ActivityMainBinding.inflate(layoutInflater) setContentView(viewBinding.root) viewBinding.btnOpenDialog.setOnClickListener { myDialogFragment.show(supportFragmentManager, "my") } } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/btnOpenDialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_open_dialog" android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" tools:visibility="visible" /> <TextView android:id="@+id/tvData1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" app:layout_constraintBottom_toTopOf="@id/tvData2" app:layout_constraintHorizontal_bias="0.501" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/btnOpenDialog" /> <TextView android:id="@+id/tvData2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@id/tvData1" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
my_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <EditText android:id="@+id/etData1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:enabled="true" android:inputType="textPersonName" app:layout_constraintBottom_toTopOf="@+id/etData2" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/etData2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:enabled="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/etData1" /> </androidx.constraintlayout.widget.ConstraintLayout>
回答1件
あなたの回答
tips
プレビュー