SearchViewはデフォルトでフォーカスされていますが、ソフトウェアキーボードを表示しようとすると、発生しません。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
しかし、SearchViewをクリックすると、そうなります。どうして?
修繕!
mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
showInputMethod(view.findFocus());
}
}
});
そして
private void showInputMethod(View view) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(view, 0);
}
}
それでもキーボードを開かないSearchViewでこの問題が発生し、200ミリ秒の遅延を追加することで開くことができました。
mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View view, boolean hasFocus) {
if (hasFocus) {
view.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view.findFocus(), 0);
}
}, 200);
}
}
});
SearchViewを使用している場合:
<Android.support.v7.widget.SearchView
Android:id="@+id/searchView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:focusableInTouchMode="true"
Android:iconifiedByDefault="true"
app:showAsAction="always"
app:iconifiedByDefault="true"/>
次に、それをonCreateメソッドに追加します。
final SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
わたしにはできる。
setOnFocusChangeListener
の使用はどうですか?
searchview.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
}
}
});
それを行うための最良かつ最も簡単な方法:
Android:focusable="true"
app:iconifiedByDefault="false"
Android:focusableInTouchMode="true"
上記の3行をSearchViewの下のxmlに追加して、魔法を見てください。
試してください:
void focusSearchViewAndOpenOrCloseKeyboard(boolean focus) {
searchView.setIconified(focus);
}
source は、SearchView
が独自の ソフトキーボードの開閉 を処理することを示しています。