Webページ内の検索を実装する・・・。
WebViewにはもともとshowFindDialogがあったが、すでにduplicateされているので今回はSearchViewを使う・・・。
まずは、menu_main.xmlにページ内検索のアイテムを追加する・・・。
android:orderInCategoryの番号を振りなおして、
最初の101にandroid:id="@+id/action_search"を割り当てる・・・。
app:showAsAction="always|collapseActionView"だが、alwaysは他のメニューアイテムと違い、検索アイコン(虫眼鏡アイコン、android:icon="@android:drawable/ic_menu_search")を右上に表示しておきたいため・・・。
collapseActionViewがないと、クエリ入力フォームを開いたり閉じたときのリスナーを拾えないので'|'で連結・・・。
app:actionViewClass="android.support.v7.widget.SearchView"で、support.v7のSearchViewをアクションビューとする・・・。
SearchView.OnQueryTextListenerはクエリ入力文字列に関するリスナー、MenuItemCompat.OnActionExpandListenerはアクションビューが開いたり閉じたりした時のリスナー・・・。
R.id.action_searchのメニューアイテムを取得し、そのインスタンスsearchItemのsetOnActionExpandListenerでthisを指定して、リスナー登録しようとしたが、そうすると落ちてしまう・・・。
(おそらく、SearchViewがsupport.v7であるためと思われる・・・。)
そこでMenuItemCompat.setOnActionExpandListenerで登録する・・・。
(そのためにリスナーもMenuItemCompatのものになっている・・・。)
searchItem.getActionViewでsearchViewを取得・・・。
searchView.setOnQueryTextListenerでthisを指定し、クエリ入力文字列のリスナーをセット・・・。
変更された時はonQueryTextChange、Enterキーで確定した時はonQueryTextSubmitが呼ばれる・・・。
確定したら、webViewの全検索を実行するのだが、API level 15はfindAll、API level 16以上はwebView.findAllAsyncを使う・・・。
検索すると、一致文字列がハイライトされる・・・。
SearchViewのクエリ入力を閉じたときにこのハイライトされた検索を解除したいので、onMenuItemActionCollapseでwebView.clearMatchesを呼んで検索を解除する・・・。
右上に検索アイコンが表示されている・・・。
メニューアイテムには表示されない・・・。
bg1.hatenablog.comにアクセス・・・。
ここで検索アイコンを押す・・・。
"の"と入力し、
確定を押したら、
さらに右下の検索キーを押す・・・。
一致する部分が青くハイライト・・・。
×マークを押すと、入力した文字列が消える・・・。
さらに左の"←"を押すと、
クエリ入力が閉じて、検索ハイライトも解除される・・・。
https://github.com/bg1bgst333/Zinc/tree/develop/android/empty_activity/android_studio/src/Zinc