プログラムでSearchViewを開くにはどうすればよいですか?


102

「SearchView」を呼び出したActionBarのこのウィジェットがあります。使用していない場合は、次のようになります。

ここに画像の説明を入力してください

そしてそれが使用されているとき、それは次のようになります:

ここに画像の説明を入力してください

(もちろんプログラム的に)検索ビューを開いて(「使用中」に)してほしい。

私は次のようないくつかの機能を試しました:

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

しかし、どれもうまくいきませんでした...

XMLのSearchView:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

回答:


255

展開SearchView

searchView.setIconified(false);

とそれを折りたたみます

searchView.setIconified(true);

あなたは、の値を変更する必要があるandroid:showAsActionからifRoom|collapseActionViewにしますalwaysSearchView属性がandroid:iconifiedByDefaultある必要がありtrue、デフォルト値である、そうでない場合は、ユーザーが崩壊することはできませんSearchView、それはプログラムで展開された後。


15
こんにちは、キーボードがポップアップしますが、SearchViewが開きません。
Eli Revah 2013年

1
こんにちは、これもうまくいきませんでした。投稿をXMLソースコードで更新しました。
Eli Revah 2013年

7
あなたは私のf * kingヒーローです
Eliseo Ocampos 2017

1
showAsAction = "always"は、ローテーション後に醜いフルスクリーンの検索バーを表示します
Francesco Gabbrielli、2018

1
showAsAction="always"展開したときに検索アイコンがアクションバーに留まるようにします。手動で検索にフォーカスしたときの外観とは異なります。
Ixx

74

expandActionView()ActionViewのonActionViewExpanded()ではなく、MenuItem を呼び出すようにしてください。

わたしにはできる。

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

10
完璧に動作しますが、API> 14の場合のみです。以前のAPIの場合は、次のように使用できます。MenuItemCompat.expandActionView(searchMenuItem);
Andrei Aulaska、2014年

これは正しい解決策です-選択したものは設定showAsAction: alwaysを強制するため、いくつかの問題が発生します。
Ixx

13

必要な場合にのみサポートライブラリを使用する場合は、次のようにします。

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

それ以外の場合は単にこれを行う

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

6

私はこれが遅いことを知っていますが

expandActionView()を呼び出して開き、collapseActionView()を呼び出して閉じてみてください。getActionView()を介して実際のアクションビューでrequestFocus()を呼び出し、検索ビューにフォーカスを与えることができます:)


1

マティアス・ロバーツの答えを拡大する:

リストのフラグメントが検索値を保持し、ユーザーが他のフラグメントから戻った後に設定することを望んでいました。

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

私が保持するメニューのalways|collapseActionView場合、それ以外の場合は、ユーザーがテキストを削除しても開いたままになります。


0

最後にsearchViewキープを開くにclose_buttonは、これをonCreate次のように使用します。

searchView.findViewById(R.id.search_button).performClick();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.