ActionBarにsearchViewがあります。ユーザーが入力を完了したら、キーボードを閉じます。 searchViewに次のqueryTextListenerがあります
final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
// Do something
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
showProgress();
// Do stuff, make async call
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
return true;
}
};
同様の質問に基づいて、次のコードはキーボードを閉じる必要がありますが、この場合は機能しません。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
私も試しました:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
どちらも動作しません。これがハニカム特有の問題なのか、ActionBarのsearchViewに関連するのか、あるいはその両方なのかはわかりません。誰かがこれを機能させた、またはなぜ機能しないのか知っていますか?
似たようなことをしようとしていました。別のSearchActivity
からActivity
を起動し、ロード時に開いた検索フィールドに検索語を表示する必要がありました。上記のすべてのアプローチを試しましたが、最終的に(上記の Ridcullyの答え と同様)変数をonCreateOptionsMenu()
でSearchView
に設定し、onQueryTextSubmit()
で呼び出しましたユーザーが新しい検索を送信したときのSearchView
のclearFocus()
:
private SearchView searchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
searchView = (SearchView) menu.findItem(R.id.menu_search)
.getActionView(); // set the reference to the searchView
searchView.setOnQueryTextListener(this);
searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search);
searchMenuItem.expandActionView(); // expand the search action item automatically
searchView.setQuery("<put your search term here>", false); // fill in the search term by default
searchView.clearFocus(); // close the keyboard on load
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
performNewSearch(query);
searchView.clearFocus();
return true;
}
シンプルで、まっすぐに、きれいに:
@Override
public boolean onQueryTextSubmit(String query) {
// your search methods
searchView.clearFocus();
return true;
}
以下のようにonQueryTextSubmitでfalseを返すだけです
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
あなたが電話すれば何とか動作します
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
その後
otherWidget.requestFocus();
私にとっては、上記のどれも最初の送信に取り組んでいませんでした。それは隠れていて、すぐにキーボードを再表示しました。ビューのハンドラーにclearFocus()
を投稿して、他のすべての処理が完了した後に実行する必要がありました。
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (!"".equals(query)) {
mSearchView.post(new Runnable() {
@Override
public void run() {
mSearchView.clearFocus();
}
});
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
私にとっては、次のように動作します:
私の活動には、メンバー変数があります
_private SearchView mSearchView;
_
onCreateOptionsMenu()
では、その変数を次のように設定します。
_public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.library, menu);
mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
mSearchView.setOnQueryTextListener(this);
return true;
}
_
最後にQueryTextListener
で、私はこれを行います:
_mSearchView.setQuery("", false);
mSearchView.setIconified(true);
_
SearchViewのソースコードを見ましたが、クエリテキストを空の文字列にリセットしないと、SearchViewはそれを実行し、キーボードも削除しません。実際、ソースコードの十分な深さまで掘り下げて同じことになるとyukuは示唆しましたが、これらの低レベルのものをいじる必要がないので、私のソリューションがより気に入っています。
編集:私は上により良いソリューションを追加しましたが、参考として古い答えも保持しました。
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
return false;
}
元の回答:setOnQueryTextListenerを使用してプログラミングしました。サーチビューが非表示になるとキーボードが消え、再び表示されるとキーボードがポップアップしなくなります。
//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;
}
});
デュアルペインアクティビティで作業しているタブレットアプリでは、
f.getView().requestFocus(); // f is the target fragment for the search
そして、検索後にソフトキーボードを閉じるのに十分でした。 InputMethodManagerを使用する必要はありません
ActionBarSherlock 4.3を使用し、ProgressDialogがあります。 postExecuteメソッドで非表示にすると、Searchviewがフォーカスを取得します。それを修正するには:
//Handle intent and hide soft keyboard
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
searchView.setQuery("", false);
searchView.setIconified(true);
searchView.clearFocus();
}
/*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/
AsyncTask.onPostExecute(){
if(pd!=null)
pd.dismiss();
if(searchView!=null)
searchView.clearFocus();
}
それが役に立てば幸い。
使用できます。
if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
onBackPressed();
}
public boolean isKeybordShowing(Context context, View view) {
try {
InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
return keyboard.isActive();
} catch (Exception ex) {
Log.e("keyboardHide", "cannot hide keyboard", ex);
return false;
}
}
以下のコードは、Searchviewでキーボードを非表示にするために働いています
MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);
edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
edtSearch.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
なぜこれを試してみませんか? Xボタンをタッチすると、どのような場合でも検索ビューにフォーカスが移ります。
ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText) findViewById(R.id.search_src_text);
et.setText("");`enter code here`
searchView.setQuery("", false);
searchView.onActionViewCollapsed();
menuSearch.collapseActionView();
}
});
私のために働いた2つのソリューション、最初のものはSearchViewインスタンスを使用していました:
private void hideKeyboard(){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}
2番目の解決策:
private void hideKeyboard(){
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}