質問編集履歴

1

以前はSQLのコードからRealmのコードに変える方法を尋ねていました。しかし、回答が得られなかったため、機能の実装に注目し、なぜ出来ないかを尋ねることにしました。

2021/12/18 22:12

投稿

happy00
happy00

スコア0

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
- さら、デベロッパガイドに検索機能を組み込もうとしましたが、デベロッパーガイドでは、SQLiteを使用しているため、私Realmだとどうプログラムすればいいのからず、困ってい
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 onCreateOptionsMenu(menu: Menu): Boolean {
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
- menuInflater.inflate(R.menu.menu_main,menu)
101
+ inflater: LayoutInflater, container: ViewGroup?,
102
+
82
-
103
+ savedInstanceState: Bundle?
104
+
83
-
105
+ ): View? {
84
-
106
+
85
- // Associate searchable configuration with the SearchView
107
+ _binding = FragmentFirstBinding.inflate(inflater, container, false)
108
+
86
-
109
+ return binding.root
110
+
111
+ }
112
+
113
+
114
+
87
- val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
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
- (menu.findItem(R.id.search).actionView as SearchView).apply {
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
- return true
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
- override fun onNewIntent(intent: Intent) {
155
+ (activity as? MainActivity)?.setFabVisible(View.VISIBLE)
116
-
117
- super.onNewIntent(intent)
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
- private fun handleIntent(intent: Intent) {
173
+ override fun onQueryTextChange(newText: String?): Boolean {
126
-
174
+
127
- if (Intent.ACTION_SEARCH == intent.action) {
175
+ val schedules = realm.where<Schedule>().contains("title",newText,Case.INSENSITIVE).findAll()
128
-
176
+
129
- val query = intent.getStringExtra(SearchManager.QUERY)
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
- 上記の方の質問参考にしてみましたがこの方と違い、私はrealmの実装もlistの作成もMainActivityではなくFirstFragmentでやっていため解決できませんでした。
323
+ 上記の方の質問参考にして、追加項目をfirstFragmentに記述した形です。MainActvityFirstFragmentのlayoutにSearchViewを追加することはきるのですが、追加しところで検索はできませんでした。できたらその理由も教えていただきたいです。
320
-
324
+
321
- 回答は、どのファイルに書き込むかも教えていただけると助かります
325
+ layoutファイルが見たいなど質問があれば尋ねください。
322
326
 
323
327
  よろしくお願いいたします。