8
14

More than 3 years have passed since last update.

【Android/Kotlin】SearchView(検索バー)とちょっと仲良くなって入力文字列を取得できるようになった

Posted at

概要

Androidアプリで、リスト内検索機能を実装したかったが、検索バーとは面識がなかった。
そこで、検索バーと少し遊んで基本的な使い方を知った。設置方法や、入力した文字列を取得する際に使えそうなメソッドを備忘録的にまとめる。
not_iconified_searchbar.png

画面に検索バーを設置する

xmlSearchViewを記述すれば検索UIを設置できる。

<SearchView
    android:id="@+id/search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
    android:queryHint="検索" />

iconifiedByDefaultfalseにして、常に検索の入力欄が表示されている状態にする。デフォルトはtrueで、trueの場合平時はアイコンのみ表示され、アイコンをクリックすると検索バーが出てくる。例えばアプリバーに設置する場合などはtrueにすると良いだろう。

iconifiedByDefault: false
not_iconified_searchbar.png

iconifiedByDefault: true
iconified_searchbar.png

また、queryHintにヒント文字列を設定しておくと、未入力状態の検索バーにヒントが表示される。

入力された文字列を取得する

setOnQueryTextListener()

「入力欄の文字列が変わったとき」と「検索ボタンが押されたとき」のイベントリスナーをセットする。

SearchView.OnQueryTextListener

  • onQueryTextChange(newText: String): Boolean
    ユーザーによって文字列が変更されたときに呼ばれる(一文字や予測変換一つ位の単位)。
    newTextはそのとき入力されている文字列。
  • onQueryTextSubmit(query: String): Boolean
    ユーザーがクエリを送信(検索ボタンをクリック)したときに呼ばれる。
    queryは送信された文字列。

例えば、検索結果をリアルタイムに表示したい場合はonQueryTextChange()に、検索ボタンを押したときに検索結果を表示する(こちらはほぼ100%やると思うが)場合はonQueryTextSubmit()に処理を記述すれば良い。

searchBar.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
    override fun onQueryTextChange(newText: String): Boolean {
        // text changed
        return false
    }
    override fun onQueryTextSubmit(query: String): Boolean {
        // submit button pressed
        return false
    }
})

検索ボタン

文字列を確定させたときはReturnボタンが検索ボタンになる。
submit_button.png

また、setSubmitButtonEnabled()で検索バーの入力欄の端に検索ボタンを表示するかどうか(真偽値)を設定でき、trueで検索ボタンが表示される。
submit_button_enabled.png

setOnQueryTextFocusChangeListener()

「検索バーのフォーカスが変わったとき」のイベントリスナーをセットする。

View.OnFocusChangeListener

  • onFocusChange(v: View, hasFocus: Boolean)
    ビューのフォーカス状態が変わったときに呼ばれる。

例えば、検索バーにフォーカスが当たっている時のみ検索キャンセルボタンを表示する、検索バー以外にフォーカスが移ったときに入力欄をリセットする、などの使い方ができる。

getQuery()

現在入力されている文字列を取得する。
例えば、独自に設置したボタンを押したときに、入力されている文字列を取得するという使い方ができる。

まとめ

  • xmlにSearchViewを記述すれば、検索バーを設置できる。このとき、バー表示にするためにiconifiedByDefaultfalseにする。
  • setOnQueryTextListener()OnQueryTextListenerをセットして、「入力欄の文字列が変わったとき」や「検索ボタンが押されたとき」の処理を設定できる。
  • setOnQueryTextFocusChangeListener()OnFocusChangeListenerをセットして、「検索バーのフォーカスが変わったとき」の処理を設定できる。
8
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
14