現在、アプリのアクションバーにSearchView
があります。検索アイコンをクリックすると、SearchView
が展開し、キーボードが期待どおりにポップアップします。 SearchView
ボックスの[X]をクリックすると、期待どおりSearchView
が閉じます。ただし、SearchView
がアクティブになり、[戻る]ボタンを押すと、アプリが終了します。これは正しい動作ですが、私が今やろうとしているのは、戻るボタンの押下をキャプチャし、SearchView
が表示されたときにSearchView
(アプリではない)を閉じるだけです。戻るボタンを押したときにプログラムでSearchView
OnCloseListener()
を呼び出す方法はありますか?たとえば、次のようなもの:
// 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);
}
@MarcinOrlowskiの回答に基づいて、次も使用できます。
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
}
}
つかいます
searchView.setIconified(true)
MenuItemCompat.collapseActionView も使用しました
MenuItemCompat.collapseActionView(menuItem)
これを行う簡単な方法があります:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.onActionViewCollapsed();
} else {
super.onBackPressed();
}
}
または使用:
@Override
public void onBackPressed() {
searchView.onActionViewCollapsed();
super.onBackPressed();
}
これにより、戻るを押す前にsearchViewが折りたたまれ、戻るアクションが呼び出されます。
両方のソリューションが機能します。
これは私のためにそれを行う唯一のものです:
toolbar.collapseActionView();
戻るボタンをインターセプトするには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()を呼び出すことにより、独自のコードでアクションビューを展開または縮小できます。
searchViewに入力がある場合
mSearchView.setIconified(true);
テキストのみをクリアします。
SearchViewを閉じる正しい方法は
mSearchView.onActionViewCollapsed();
つかいます:
searchView.setIconified(true);
fragmentmanager's
backstack
に追加したフラグメントがある場合、オプション2は機能しないため、!searchView.isIconified()
メソッド内のif(isSearchViewVisible)
よりもonBackPressed()
の方が好きです。押された。
これには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"/>
そして、あなたは行く準備ができています;)
追伸-私は長い間解決策を探していましたが、今では解決策を見つけました。すべての人に役立つことを願っています。
また、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" />
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"/>
私のやり方:
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); } }
<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" />
CustomSearchView searchView =(CustomSearchView)menu.findItem(R.id.menu_search).getActionView();