web-dev-qa-db-ja.com

SearchViewをプログラムで閉じるにはどうすればよいですか?

現在、アプリのアクションバーにSearchViewがあります。検索アイコンをクリックすると、SearchViewが展開し、キーボードが期待どおりにポップアップします。 SearchViewボックスの[X]をクリックすると、期待どおりSearchViewが閉じます。ただし、SearchViewがアクティブになり、[戻る]ボタンを押すと、アプリが終了します。これは正しい動作ですが、私が今やろうとしているのは、戻るボタンの押下をキャプチャし、SearchViewが表示されたときにSearchView(アプリではない)を閉じるだけです。戻るボタンを押したときにプログラムでSearchViewOnCloseListener()を呼び出す方法はありますか?たとえば、次のようなもの:

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
62
Tim

@MarcinOrlowskiの回答に基づいて、次も使用できます。

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
141
Mohsen Afshin

つかいます

searchView.setIconified(true)

MenuItemCompat.collapseActionView も使用しました

MenuItemCompat.collapseActionView(menuItem)
49
betorcs

これを行う簡単な方法があります:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

または使用:

@Override
public void onBackPressed() {
    searchView.onActionViewCollapsed();
    super.onBackPressed();
}

これにより、戻るを押す前にsearchViewが折りたたまれ、戻るアクションが呼び出されます。

両方のソリューションが機能します。

32
blueware

これは私のためにそれを行う唯一のものです:

  toolbar.collapseActionView();
29
raklos

戻るボタンをインターセプトするにはonBackPressed()ドキュメントを参照

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

[〜#〜] edit [〜#〜]

ドキュメントの発言

必要に応じて、MenuItemでexpandActionView()およびcollapseActionView()を呼び出すことにより、独自のコードでアクションビューを展開または縮小できます。

23
Marcin Orlowski

searchViewに入力がある場合

mSearchView.setIconified(true);

テキストのみをクリアします。

SearchViewを閉じる正しい方法は

mSearchView.onActionViewCollapsed();
13
DoruChidean

つかいます:

searchView.setIconified(true);
2
Alex

fragmentmanager'sbackstackに追加したフラグメントがある場合、オプション2は機能しないため、!searchView.isIconified()メソッド内のif(isSearchViewVisible)よりもonBackPressed()の方が好きです。押された。

2
Codedroid

これにはonBackPressed()メソッドを使用する必要はありません!! SearchView自体が戻るボタンを押したときイベントを処理するように、解決策を見つけました。

onCreateOptionsMenu()メソッド内で、

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

menu.xml addshowAsAction属性で、その値を"always|collapseActionView"

<item
    Android:id="@+id/action_search_item"
    Android:title="Search"
    Android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"/>

そして、あなたは行く準備ができています;)

追伸-私は長い間解決策を探していましたが、今では解決策を見つけました。すべての人に役立つことを願っています。

0
codervishal

また、collapseActionViewを使用できます。 SearchViewを折りたたみ、戻るボタンを自動的に処理します

<item
      Android:id="@+id/action_search"
      Android:icon="@drawable/ic_magnify"
      Android:title="@string/action_title_search"
      app:actionViewClass="Android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView" />
0
Deni Erdyneev

onBackPressed()メソッドで関数を使用しない場合は、Activityから削除します。そのため、SearchView自体がonBackPressイベントを処理します。

SearchViewを使用しています

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchview.setIconifiedByDefault(true);
    searchview.setOnQueryTextListener(this);
    searchview.setSubmitButtonEnabled(true);  
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater);
}

次のように私のmenu.xml

<item
    Android:id="@+id/action_search"
    Android:icon="@drawable/search_tool"
    Android:orderInCategory="1"
    Android:title="Search" 
    app:actionViewClass="Android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>
0
SachinS

私のやり方:

  1. CustomSearchViewクラスを作成します
 
 public class CustomSearchView extends SearchView {
 public CustomSearchView(final Context context){
 super(context); 
 this.setIconifiedByDefault(true) ; 
} 
 
 @Override 
 public boolean dispatchKeyEventPreIme(KeyEvent event){
 if(event.getKeyCode()== KeyEvent.KEYCODE_BACK && 
 event.getAction()== KeyEvent.ACTION_UP){
 this.onActionViewCollapsed(); 
} 
 return super.dispatchKeyEventPreIme(event); 
} 
} 
 
  1. ActionViewClassを追加する
 <item 
 Android:id = "@ + id/menu_search" 
 Android:title = "@ string/menu_search" 
 Android:icon = "@ drawable /ic_search"
 Android:showAsAction = "collapseActionView | ifRoom" 
 Android:actionViewClass = "com.myapp.CustomSearchView" />
  1. CustomCreateViewをonCreateOptionsMenuに作成します
 CustomSearchView searchView =(CustomSearchView)menu.findItem(R.id.menu_search).getActionView(); 
0
Sergei K