teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード修正忘れ

2021/10/24 07:40

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -19,7 +19,6 @@
19
19
  class MainActivity : AppCompatActivity(), MyDialogFragment.DialogListener {
20
20
 
21
21
  private lateinit var viewBinding: ActivityMainBinding
22
- val myDialogFragment = MyDialogFragment()
23
22
 
24
23
  override fun onCreate(savedInstanceState: Bundle?) {
25
24
  super.onCreate(savedInstanceState)

1

コード追加

2021/10/24 07:40

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -1,3 +1,113 @@
1
1
  MainActivity の ```val myDialogFragment = MyDialogFragment()``` を ```myDialogFragment.show(supportFragmentManager, "my")``` の直前に移動させてください。
2
2
 
3
- フラグメントは一般的にシステムに渡した後はアプリで参照を保持しないほうが良いです。表示が終わると自動で削除される(ことがある)為、再利用は出来ず、その参照を保持しているとメモリリークとなります。(正式に具体的にどこでどうなって…という所は追っていないのでお伝え出来ません(_ _;スミマセン )
3
+ フラグメントは一般的にシステムに渡した後はアプリで参照を保持しないほうが良いです。表示が終わると自動で削除される(ことがある)為、再利用は出来ず、その参照を保持しているとメモリリークとなります。(正式に具体的にどこでどうなって…という所は追っていないのでお伝え出来ません(_ _;スミマセン )
4
+
5
+ ----
6
+
7
+ ダイアログで 2 つの EditText の入力をして OK を押したらインターフェースのメソッドを呼ぶようにしてみました。
8
+
9
+ MainActivity.kt
10
+ ```kotlin
11
+ package com.teratail.q365939
12
+
13
+ import androidx.appcompat.app.AppCompatActivity
14
+ import android.os.Bundle
15
+ import android.util.Log
16
+ import com.teratail.q365939.databinding.ActivityMainBinding
17
+ //import net.sytes.rokkosan.myalertdialog.databinding.ActivityMainBinding
18
+
19
+ class MainActivity : AppCompatActivity(), MyDialogFragment.DialogListener {
20
+
21
+ private lateinit var viewBinding: ActivityMainBinding
22
+ val myDialogFragment = MyDialogFragment()
23
+
24
+ override fun onCreate(savedInstanceState: Bundle?) {
25
+ super.onCreate(savedInstanceState)
26
+ //setContentView(R.layout.activity_main)
27
+
28
+ // set View Binding
29
+ viewBinding = ActivityMainBinding.inflate(layoutInflater)
30
+ setContentView(viewBinding.root)
31
+
32
+ viewBinding.btnOpenDialog.setOnClickListener {
33
+ val myDialogFragment = MyDialogFragment()
34
+ myDialogFragment.show(supportFragmentManager, "my")
35
+ }
36
+ }
37
+
38
+ override fun onMyDialogOk(text1: String, text2: String) {
39
+ Log.d("MainActivity", "text1=$text1")
40
+ Log.d("MainActivity", "text2=$text2")
41
+ }
42
+ }
43
+ ```
44
+ MyDialogFragment.kt
45
+ ```kotlin
46
+ package com.teratail.q365939
47
+
48
+ import android.app.Dialog
49
+ import android.content.Context
50
+ import android.os.Bundle
51
+ import android.text.Editable
52
+ import android.text.TextWatcher
53
+ import android.widget.Button
54
+ import android.widget.EditText
55
+ import androidx.appcompat.app.AlertDialog
56
+ import androidx.fragment.app.DialogFragment
57
+
58
+ //[ダイアログ](https://developer.android.com/guide/topics/ui/dialogs?hl=ja)
59
+ class MyDialogFragment: DialogFragment() {
60
+ internal lateinit var listener: DialogListener
61
+
62
+ interface DialogListener {
63
+ fun onMyDialogOk(text1: String, text2: String)
64
+ }
65
+
66
+ override fun onAttach(context: Context) {
67
+ super.onAttach(context)
68
+ try {
69
+ listener = context as DialogListener
70
+ } catch (e: ClassCastException) {
71
+ throw ClassCastException((context.toString() + " must implement DialogListener"))
72
+ }
73
+ }
74
+
75
+ //二つの EditText に文字列があるか無いかで Button の enable を制御する
76
+ class EditsWatcher(val button: Button, val edit1: EditText, val edit2: EditText): TextWatcher {
77
+ init {
78
+ edit1.addTextChangedListener(this)
79
+ edit2.addTextChangedListener(this)
80
+ afterTextChanged(null)
81
+ }
82
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} //ignore
83
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} //ignore
84
+ override fun afterTextChanged(s: Editable?) {
85
+ button.isEnabled = edit1.text.toString().trim().isNotEmpty() && edit2.text.toString().trim().isNotEmpty();
86
+ }
87
+ }
88
+
89
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
90
+ return activity?.let {
91
+
92
+ val view = requireActivity().layoutInflater.inflate(R.layout.my_dialog, null)
93
+ val edData1 = view.findViewById<EditText>(R.id.etData1)
94
+ val edData2 = view.findViewById<EditText>(R.id.etData2)
95
+
96
+ val builder = AlertDialog.Builder(it).setView(view)
97
+ .setPositiveButton(android.R.string.ok, { dialog, id ->
98
+ listener.onMyDialogOk(edData1.text.toString(), edData2.text.toString())
99
+ })
100
+ .setNegativeButton(android.R.string.cancel, { dialog, id ->
101
+ dialog.cancel()
102
+ })
103
+
104
+ builder.create().also { dialog ->
105
+ dialog.setOnShowListener({
106
+ val button = dialog.getButton(Dialog.BUTTON_POSITIVE)
107
+ EditsWatcher(button, edData1, edData2)
108
+ })
109
+ }
110
+ } ?: throw IllegalStateException("Activity cannot be null")
111
+ }
112
+ }
113
+ ```