現在、ActionBarメニュー項目を使用して、アクションバーにSearchViewを表示しています。検索メニュー項目が展開されると、ソフトキーボードが表示されます。ユーザーが戻るボタンを押してソフトキーボードを閉じると、アクションバーのSearchViewも折りたたむようになりました。
次のリスナーOnKeyListenerとOnFocusChangeListenerをMenuItemとActionViewに実装してみました。また、アクティビティでOnBackPressed()を使用してみました。上記のどれも、戻るボタンがソフトキーボードを閉じるために使用されるとき、検出しません。
何か案は?
SearchViewがいつ表示されるかを知るために、OnActionExpandListenerを実装しました。
怠け者に対する@ user1258568の答えを拡張します。これは私のために働いた。フォーカスが失われると、クエリがクリアされることに注意してください。
final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean queryTextFocused) {
if(!queryTextFocused) {
searchMenuItem.collapseActionView();
searchView.setQuery("", false);
}
}
});
より良い解決策を見つけました。
searchView.setOnQueryTextFocusChangeListener().
OnQueryTextFocusChangeListener
は、キーボードが表示または非表示になったときに呼び出されます。キーボードが表示され、検索ビューにフォーカスがあるときに最初に呼び出されます。 keyboard
が非表示になり、検索ビューがフォーカスを失うと、再度呼び出されますclose search view
thenを使用
menuItem.collapseActionView().
次のようにonBackPressedをオーバーライドします。
@Override
public void onBackPressed() {
if (searchView.isShown()){
searchView.onActionViewCollapsed(); //collapse your ActionView
searchView.setQuery("",false); //clears your query without submit
isClosed = true; //needed to handle closed by back
} else{
super.onBackPressed();
}
}
onCreateOptionsMenuは、mSearchViewを次のように膨らませます。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_search, menu);
mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView();
mSearchView.setOnQueryTextListener(this);
mSearchView.setOnSearchClickListener(this);
mSearchView.setOnCloseListener(this);
isClosed = true;
return true;
}
次のようにクラスを実装してください:
public class myActivity extends FragmentActivity implements
SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
あなたも必要になります:
@Override
public void onClick(View view) {
isClosed = false;
}
@Override
public boolean onClose() {
isClosed = true;
return false;
}
「mSearchView」と「isClosed」の両方をアクティビティのグローバル変数にする必要があります。
メニューレイアウトに「collapseActionView」属性を配置するだけです
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/menu_item_search"
Android:title="@string/search"
Android:iconifiedByDefault="true"
Android:icon="@drawable/ic_action_search"
app:actionViewClass="Android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>
クエリを送信したら、SearchViewでメソッド「clearFocus」を呼び出してキーボードを閉じることを忘れないでください。
ジョン・ウィリスからの答えは素晴らしいです。これは彼の答えの改善です。
最初に、View.OnFocusChangeListener
を実装する新しいクラスを作成します。
public class SearchViewFocusListener implements View.OnFocusChangeListener {
private final MenuItem mMenuItem;
public SearchViewFocusListener(MenuItem menuItem) {
mMenuItem = menuItem;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
mMenuItem.collapseActionView();
if (v instanceof SearchView) {
((SearchView) v).setQuery("", false);
}
}
}
}
次に、SearchView
にリスナーを設定します。
searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
次のように達成できます。
private void setupSearchView(Menu menu) {
final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();
[...]
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchMenuItem.collapseActionView();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
});
}
イベントが起動されなかったため、setOnQueryTextFocusChangeListener()に基づくソリューションは機能しませんでした-検索ビューを含む同じアクティビティで検索を実行した可能性があるため、送信時にsearchViewがフォーカスを失いませんでした。
とにかく、OnQueryTextListenerを使用する方が、テキストを送信するイベントをより正確に記述するため、より正確だと思います。
これは、キーボードを消すために私がしたことです。これがあなたのために働くかどうか確かめることを試みることができます。 searchView
を非表示に設定してから、再び表示に設定しました。
//set query change listener
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
/**
* hides and then unhides search tab to make sure keyboard disappears when query is submitted
*/
searchView.setVisibility(View.INVISIBLE);
searchView.setVisibility(View.VISIBLE);
return false;
}
});
ユーザーがキーボードの検索アイコンをクリックしたときにキーボードを折りたたむ場合、これは簡単な方法で実現できます
_inside onquerytextsubmitted {
_
searchView.clearfocus()
_}
_
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.home_screen, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
final SearchView searchView = (SearchView) searchMenuItem
.getActionView();
searchView.setIconifiedByDefault(false);
if (searchManager != null && searchView != null) {
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView
.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (searchMenuItem != null) {
searchMenuItem.collapseActionView();
}// end if
if (searchView != null) {
searchView.setQuery("", false);
}// end if
}// end if
}
});
searchView
.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
/**
* hides and then unhides search tab to make sure
* keyboard disappears when query is submitted
*/
if (searchView != null) {
searchView.setVisibility(View.INVISIBLE);
searchView.setVisibility(View.VISIBLE);
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
});
}
return super.onCreateOptionsMenu(menu);
}
何らかの理由で、menuItem.collapseActionView()
が機能しなかったため、代わりにsearchView.setIconified(true)
を使用しました。
これにより、コードサンプルとして以下の結果が得られます。
final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
searchView.setIconified(true);
}
}
});
SetIconifiedを2回呼び出す必要があります。
検索ビューを実際に折りたたみ、キーボードを閉じます。
最初の呼び出しでは、検索ビューのテキストは2番目の呼び出しキーボードでクリアされ、検索ビューは閉じられます。