読者です 読者をやめる 読者になる 読者になる

Zinc #18 ページ内検索の実装

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を呼んで検索を解除する・・・。

f:id:BG1:20160718152406p:plain

右上に検索アイコンが表示されている・・・。

f:id:BG1:20160718152426p:plain

メニューアイテムには表示されない・・・。

f:id:BG1:20160718152447p:plain

bg1.hatenablog.comにアクセス・・・。

f:id:BG1:20160718152524p:plain

ここで検索アイコンを押す・・・。

f:id:BG1:20160718152603p:plain

"の"と入力し、

f:id:BG1:20160718152648p:plain

確定を押したら、

f:id:BG1:20160718152901p:plain

さらに右下の検索キーを押す・・・。

f:id:BG1:20160718153352p:plain

一致する部分が青くハイライト・・・。

f:id:BG1:20160718153435p:plain

×マークを押すと、入力した文字列が消える・・・。
さらに左の"←"を押すと、

f:id:BG1:20160718153530p:plain

クエリ入力が閉じて、検索ハイライトも解除される・・・。

https://github.com/bg1bgst333/Zinc/tree/develop/android/empty_activity/android_studio/src/Zinc