質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

1062閲覧

Realmを使用したスケジューラアプリに検索機能を付けたい

happy00

総合スコア0

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/11/30 10:31

編集2021/12/18 22:12

前提・実現したいこと

Android Studioで勉強しているプログラミング初心者です。
現在、『はじめてのAndroidプログラミング 第5版』を用いてプログラムを作成しています。
こちらの「CHAPTER11 スケジューラアプリを作ろう」によるスケジューラアプリにスケジュールのタイトルを検索できるようにしたいと考えています。
firsrFragmentに検索に使うコードを記述したら、特にエラーは起きなかったのですが、検索アイコンが表示されませんでした。menu inflate で指定しているつもりですが、なぜ出来ていないのか分かりません。
どなたかお優しい方がいらっしゃいましたら、詳しくご教示していただきたいです。

MainActivity.kt

kotlin

1class MainActivity : AppCompatActivity() { 2 private lateinit var binding: ActivityMainBinding 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 binding = ActivityMainBinding.inflate(layoutInflater) 6 setContentView(binding.root) 7 setSupportActionBar(findViewById(R.id.toolbar)) 8 9 val naviController = findNavController(R.id.nav_host_fragment) 10 setupActionBarWithNavController(naviController) 11 12 binding.fab.setOnClickListener { view -> 13 naviController.navigate(R.id.action_to_scheduleEditFragment) 14 } 15 } 16 17 override fun onSupportNavigateUp() 18 = findNavController(R.id.nav_host_fragment).navigateUp() 19 20 fun setFabVisible(visibility: Int) { 21 binding.fab.visibility = visibility 22 } 23}

FirstFragment.kt

kotlin

1class FirstFragment : Fragment() { 2 3 private var _binding: FragmentFirstBinding? = null 4 private val binding get() = _binding!! 5 6 private lateinit var realm: Realm 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 realm = Realm.getDefaultInstance() 11 } 12 13 override fun onCreateView( 14 inflater: LayoutInflater, container: ViewGroup?, 15 savedInstanceState: Bundle? 16 ): View? { 17 _binding = FragmentFirstBinding.inflate(inflater, container, false) 18 return binding.root 19 } 20 21 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 22 super.onViewCreated(view, savedInstanceState) 23 24 view.findViewById<Button>(R.id.button_first).setOnClickListener { 25 findNavController() 26 .navigate(R.id.action_FirstFragment_to_SecondFragment) 27 } 28 binding.list.layoutManager = LinearLayoutManager(context) 29 val schedules = realm.where<Schedule>().findAll() 30 val adapter = ScheduleAdapter(schedules) 31 binding.list.adapter = adapter 32 33 adapter.setOnItemClickListener { id -> 34 id?.let { 35 val action = 36 FirstFragmentDirections.actionToScheduleEditFragment(it) 37 findNavController().navigate(action) 38 } 39 } 40 41 (activity as? MainActivity)?.setFabVisible(View.VISIBLE) 42 } 43  //以降に検索機能を実装 44 override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 45 super.onCreateOptionsMenu(menu, inflater) 46 47 val searchView = menu.findItem(R.id.search).actionView as SearchView 48 searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { 49 override fun onQueryTextSubmit(query: String?): Boolean = false 50 override fun onQueryTextChange(newText: String?): Boolean { 51 val schedules = realm.where<Schedule>().contains("title",newText,Case.INSENSITIVE).findAll() 52 val adapter = ScheduleAdapter(schedules) 53 binding.list.adapter = adapter 54 55 return true 56 } 57 }) 58 } 59 60 override fun onDestroyView() { 61 super.onDestroyView() 62 _binding = null 63 } 64 65 override fun onDestroy() { 66 super.onDestroy() 67 realm.close() 68 } 69}

/res/menu/menu_main.xml

kotlin

1<menu xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:tools="http://schemas.android.com/tools" 4 tools:context="com.example.myscheduler.MainActivity"> 5 <item 6 android:id="@+id/search" 7 android:orderInCategory="102" 8 android:title="@string/app_name" 9 android:icon="@android:drawable/ic_menu_search" 10 app:actionViewClass="android.widget.SearchView" 11 app:showAsAction="always" /> 12</menu>

res/xml/searchable.xml

kotlin

1<?xml version="1.0" encoding="utf-8"?> 2<searchable xmlns:android="http://schemas.android.com/apk/res/android" 3 android:label="@string/app_name" 4 android:hint="@string/app_name"/>

AndroidManifest.xml

kotlin

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.myscheduler"> 4 5 <application 6 android:name=".MySchedulerApplication" 7 android:allowBackup="true" 8 android:icon="@mipmap/ic_launcher" 9 android:label="@string/app_name" 10 android:roundIcon="@mipmap/ic_launcher_round" 11 android:supportsRtl="true" 12 android:theme="@style/Theme.MyScheduler"> 13 <activity 14 android:name=".MainActivity" 15 android:label="@string/app_name" 16 android:theme="@style/Theme.MyScheduler.NoActionBar"> 17 <meta-data android:name="android.app.searchable" 18 android:resource="@xml/searchable"/> 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 </application> 26 27</manifest>

試したこと

https://teratail.com/questions/331882
上記の方の質問を参考にして、追加項目をfirstFragmentに記述した形です。MainActvityやFirstFragmentのlayoutにSearchViewを追加することはできるのですが、追加したところで、検索はできませんでした。できたらその理由も教えていただきたいです。
layoutファイルが見たいなど質問があれば尋ねてください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問