質問編集履歴
1
以前はSQLのコードからRealmのコードに変える方法を尋ねていました。しかし、回答が得られなかったため、機能の実装に注目し、なぜ出来ないかを尋ねることにしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,17 +8,7 @@
|
|
8
8
|
|
9
9
|
こちらの「CHAPTER11 スケジューラアプリを作ろう」によるスケジューラアプリにスケジュールのタイトルを検索できるようにしたいと考えています。
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
https://developer.android.com/training/search/setup?hl=ja
|
14
|
-
|
15
|
-
上記のデベロッパーガイドを参考に検索インターフェースを設定しました。
|
16
|
-
|
17
|
-
|
11
|
+
firsrFragmentに検索に使うコードを記述したら、特にエラーは起きなかったのですが、検索アイコンが表示されませんでした。menu inflate で指定しているつもりですが、なぜ出来ていないのか分かりません。
|
18
|
-
|
19
|
-
コンパイルはできていて、検索欄に入力することはできますが、そこから絞り込みがされない状況です。
|
20
|
-
|
21
|
-
|
22
12
|
|
23
13
|
どなたかお優しい方がいらっしゃいましたら、詳しくご教示していただきたいです。
|
24
14
|
|
@@ -74,63 +64,147 @@
|
|
74
64
|
|
75
65
|
}
|
76
66
|
|
77
|
-
|
67
|
+
}
|
68
|
+
|
78
|
-
|
69
|
+
```
|
70
|
+
|
71
|
+
### FirstFragment.kt
|
72
|
+
|
73
|
+
```kotlin
|
74
|
+
|
75
|
+
class FirstFragment : Fragment() {
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
private var _binding: FragmentFirstBinding? = null
|
80
|
+
|
81
|
+
private val binding get() = _binding!!
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
private lateinit var realm: Realm
|
86
|
+
|
87
|
+
|
88
|
+
|
79
|
-
override fun onCreate
|
89
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
90
|
+
|
80
|
-
|
91
|
+
super.onCreate(savedInstanceState)
|
92
|
+
|
93
|
+
realm = Realm.getDefaultInstance()
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
override fun onCreateView(
|
100
|
+
|
81
|
-
|
101
|
+
inflater: LayoutInflater, container: ViewGroup?,
|
102
|
+
|
82
|
-
|
103
|
+
savedInstanceState: Bundle?
|
104
|
+
|
83
|
-
|
105
|
+
): View? {
|
84
|
-
|
106
|
+
|
85
|
-
|
107
|
+
_binding = FragmentFirstBinding.inflate(inflater, container, false)
|
108
|
+
|
86
|
-
|
109
|
+
return binding.root
|
110
|
+
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
|
87
|
-
|
115
|
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
116
|
+
|
88
|
-
|
117
|
+
super.onViewCreated(view, savedInstanceState)
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
view.findViewById<Button>(R.id.button_first).setOnClickListener {
|
122
|
+
|
123
|
+
findNavController()
|
124
|
+
|
89
|
-
|
125
|
+
.navigate(R.id.action_FirstFragment_to_SecondFragment)
|
90
|
-
|
91
|
-
setSearchableInfo(searchManager.getSearchableInfo(componentName))
|
92
126
|
|
93
127
|
}
|
94
128
|
|
95
|
-
|
129
|
+
binding.list.layoutManager = LinearLayoutManager(context)
|
130
|
+
|
96
|
-
|
131
|
+
val schedules = realm.where<Schedule>().findAll()
|
132
|
+
|
133
|
+
val adapter = ScheduleAdapter(schedules)
|
134
|
+
|
135
|
+
binding.list.adapter = adapter
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
adapter.setOnItemClickListener { id ->
|
140
|
+
|
97
|
-
|
141
|
+
id?.let {
|
142
|
+
|
98
|
-
|
143
|
+
val action =
|
144
|
+
|
145
|
+
FirstFragmentDirections.actionToScheduleEditFragment(it)
|
146
|
+
|
147
|
+
findNavController().navigate(action)
|
148
|
+
|
99
|
-
}
|
149
|
+
}
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
class SearchResultsActivity : Activity() {
|
104
|
-
|
105
|
-
override fun onCreate(savedInstanceState: Bundle?) {
|
106
|
-
|
107
|
-
super.onCreate(savedInstanceState)
|
108
|
-
|
109
|
-
handleIntent(intent)
|
110
150
|
|
111
151
|
}
|
112
152
|
|
113
153
|
|
114
154
|
|
115
|
-
|
155
|
+
(activity as? MainActivity)?.setFabVisible(View.VISIBLE)
|
116
|
-
|
117
|
-
|
156
|
+
|
118
|
-
|
119
|
-
handleIntent(intent)
|
120
|
-
|
121
|
-
|
157
|
+
}
|
158
|
+
|
122
|
-
|
159
|
+
//以降に検索機能を実装
|
160
|
+
|
123
|
-
|
161
|
+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
162
|
+
|
124
|
-
|
163
|
+
super.onCreateOptionsMenu(menu, inflater)
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
val searchView = menu.findItem(R.id.search).actionView as SearchView
|
168
|
+
|
169
|
+
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
|
170
|
+
|
171
|
+
override fun onQueryTextSubmit(query: String?): Boolean = false
|
172
|
+
|
125
|
-
|
173
|
+
override fun onQueryTextChange(newText: String?): Boolean {
|
126
|
-
|
174
|
+
|
127
|
-
|
175
|
+
val schedules = realm.where<Schedule>().contains("title",newText,Case.INSENSITIVE).findAll()
|
128
|
-
|
176
|
+
|
129
|
-
val
|
177
|
+
val adapter = ScheduleAdapter(schedules)
|
178
|
+
|
179
|
+
binding.list.adapter = adapter
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
return true
|
130
184
|
|
131
185
|
}
|
132
186
|
|
187
|
+
})
|
188
|
+
|
133
|
-
|
189
|
+
}
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
override fun onDestroyView() {
|
194
|
+
|
195
|
+
super.onDestroyView()
|
196
|
+
|
197
|
+
_binding = null
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
override fun onDestroy() {
|
204
|
+
|
205
|
+
super.onDestroy()
|
206
|
+
|
207
|
+
realm.close()
|
134
208
|
|
135
209
|
}
|
136
210
|
|
@@ -138,124 +212,56 @@
|
|
138
212
|
|
139
213
|
```
|
140
214
|
|
141
|
-
### FirstFragment.kt
|
142
|
-
|
143
|
-
```kotlin
|
144
|
-
|
145
|
-
class FirstFragment : Fragment() {
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
private var _binding: FragmentFirstBinding? = null
|
150
|
-
|
151
|
-
private val binding get() = _binding!!
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
private lateinit var realm: Realm
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
override fun onCreate(savedInstanceState: Bundle?) {
|
160
|
-
|
161
|
-
super.onCreate(savedInstanceState)
|
162
|
-
|
163
|
-
realm = Realm.getDefaultInstance()
|
164
|
-
|
165
|
-
}
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
override fun onCreateView(
|
170
|
-
|
171
|
-
inflater: LayoutInflater, container: ViewGroup?,
|
172
|
-
|
173
|
-
savedInstanceState: Bundle?
|
174
|
-
|
175
|
-
): View? {
|
176
|
-
|
177
|
-
_binding = FragmentFirstBinding.inflate(inflater, container, false)
|
178
|
-
|
179
|
-
return binding.root
|
180
|
-
|
181
|
-
}
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
186
|
-
|
187
|
-
super.onViewCreated(view, savedInstanceState)
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
view.findViewById<Button>(R.id.button_first).setOnClickListener {
|
192
|
-
|
193
|
-
findNavController()
|
194
|
-
|
195
|
-
.navigate(R.id.action_FirstFragment_to_SecondFragment)
|
196
|
-
|
197
|
-
}
|
198
|
-
|
199
|
-
binding.list.layoutManager = LinearLayoutManager(context)
|
200
|
-
|
201
|
-
val schedules = realm.where<Schedule>().findAll()
|
202
|
-
|
203
|
-
val adapter = ScheduleAdapter(schedules)
|
204
|
-
|
205
|
-
binding.list.adapter = adapter
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
adapter.setOnItemClickListener { id ->
|
210
|
-
|
211
|
-
id?.let {
|
212
|
-
|
213
|
-
val action =
|
214
|
-
|
215
|
-
FirstFragmentDirections.actionToScheduleEditFragment(it)
|
216
|
-
|
217
|
-
findNavController().navigate(action)
|
218
|
-
|
219
|
-
}
|
220
|
-
|
221
|
-
}
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
(activity as? MainActivity)?.setFabVisible(View.VISIBLE)
|
226
|
-
|
227
|
-
}
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
override fun onDestroyView() {
|
232
|
-
|
233
|
-
super.onDestroyView()
|
234
|
-
|
235
|
-
_binding = null
|
236
|
-
|
237
|
-
}
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
override fun onDestroy() {
|
242
|
-
|
243
|
-
super.onDestroy()
|
244
|
-
|
245
|
-
realm.close()
|
246
|
-
|
247
|
-
}
|
248
|
-
|
249
|
-
}
|
250
|
-
|
251
|
-
```
|
252
|
-
|
253
215
|
### /res/menu/menu_main.xml
|
254
216
|
|
255
217
|
```kotlin
|
256
218
|
|
219
|
+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
220
|
+
|
221
|
+
xmlns:app="http://schemas.android.com/apk/res-auto"
|
222
|
+
|
223
|
+
xmlns:tools="http://schemas.android.com/tools"
|
224
|
+
|
225
|
+
tools:context="com.example.myscheduler.MainActivity">
|
226
|
+
|
227
|
+
<item
|
228
|
+
|
229
|
+
android:id="@+id/search"
|
230
|
+
|
231
|
+
android:orderInCategory="102"
|
232
|
+
|
233
|
+
android:title="@string/app_name"
|
234
|
+
|
235
|
+
android:icon="@android:drawable/ic_menu_search"
|
236
|
+
|
237
|
+
app:actionViewClass="android.widget.SearchView"
|
238
|
+
|
239
|
+
app:showAsAction="always" />
|
240
|
+
|
241
|
+
</menu>
|
242
|
+
|
243
|
+
```
|
244
|
+
|
245
|
+
### res/xml/searchable.xml
|
246
|
+
|
247
|
+
```kotlin
|
248
|
+
|
257
249
|
<?xml version="1.0" encoding="utf-8"?>
|
258
250
|
|
251
|
+
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
|
252
|
+
|
253
|
+
android:label="@string/app_name"
|
254
|
+
|
255
|
+
android:hint="@string/app_name"/>
|
256
|
+
|
257
|
+
```
|
258
|
+
|
259
|
+
### AndroidManifest.xml
|
260
|
+
|
261
|
+
```kotlin
|
262
|
+
|
263
|
+
<?xml version="1.0" encoding="utf-8"?>
|
264
|
+
|
259
265
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
260
266
|
|
261
267
|
package="com.example.myscheduler">
|
@@ -286,6 +292,10 @@
|
|
286
292
|
|
287
293
|
android:theme="@style/Theme.MyScheduler.NoActionBar">
|
288
294
|
|
295
|
+
<meta-data android:name="android.app.searchable"
|
296
|
+
|
297
|
+
android:resource="@xml/searchable"/>
|
298
|
+
|
289
299
|
<intent-filter>
|
290
300
|
|
291
301
|
<action android:name="android.intent.action.MAIN" />
|
@@ -294,14 +304,8 @@
|
|
294
304
|
|
295
305
|
<category android:name="android.intent.category.LAUNCHER" />
|
296
306
|
|
297
|
-
<action android:name="android.intent.action.SEARCH"/>
|
298
|
-
|
299
307
|
</intent-filter>
|
300
308
|
|
301
|
-
<meta-data android:name="android.app.searchable"
|
302
|
-
|
303
|
-
android:resource="@xml/searchable"/>
|
304
|
-
|
305
309
|
</activity>
|
306
310
|
|
307
311
|
</application>
|
@@ -316,8 +320,8 @@
|
|
316
320
|
|
317
321
|
https://teratail.com/questions/331882
|
318
322
|
|
319
|
-
上記の方の質問
|
323
|
+
上記の方の質問を参考にして、追加項目をfirstFragmentに記述した形です。MainActvityやFirstFragmentのlayoutにSearchViewを追加することはできるのですが、追加したところで、検索はできませんでした。できたらその理由も教えていただきたいです。
|
320
|
-
|
324
|
+
|
321
|
-
|
325
|
+
layoutファイルが見たいなど質問があれば尋ねてください。
|
322
326
|
|
323
327
|
よろしくお願いいたします。
|