Activity
、ボタン、EditText
を含むListView
があります。目的は、EditText
に検索画面を入力し、ボタンを押して、検索結果にこのリストを表示させることです。
これはすべて完全に機能していますが、仮想キーボードの動作はおかしいです。
EditText
をクリックすると、仮想キーボードが表示されます。仮想キーボードの「完了」ボタンをクリックすると、消えます。ただし、仮想キーボードの[完了]をクリックする前に検索ボタンをクリックすると、仮想キーボードはそのままで、削除できません。 「完了」ボタンをクリックしても、キーボードは閉じません。 [完了]ボタンが[完了]から矢印に変わり、表示されたままになります。
ご協力いただきありがとうございます
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
return true;
}
return false;
}
});
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
onClick(View v)
イベントの直後にこれを配置します。
インポートする必要がありますAndroid.view.inputmethod.InputMethodManager
;
ボタンをクリックすると、キーボードが非表示になります。
以下のコードを使用
your_button_id.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
}
});
EditViewにOnEditorActionListener
を実装する必要があります
public void performClickOnDone(EditView editView, final View button){
textView.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
hideKeyboard();
button.requestFocus();
button.performClick();
return true;
}
});
そして、次の方法でキーボードを非表示にします。
public void hideKeybord(View view) {
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
onClickListener
を使用してボタンに隠れているキーボードも起動する必要があります
これで、仮想キーボードとボタンの「完了」をクリックしても同じことが行われます。キーボードを非表示にしてクリック操作を実行します。
ボタンクリックイベント内に次のコードを追加します。
InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
アクティビティの場合、
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
フラグメントの場合、getActivity()を使用します
getActivity()。getSystemService();
getActivity()。getCurrentFocus();
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
編集テキストは1つしかないため、ボタンのクリック内でその編集テキストに対して実行されるアクションを呼び出すだけで、残りはシステムによって処理されます。エディットテキストが複数ある場合、最初にフォーカスされたエディットテキストを取得する必要があるため、これはそれほど効率的ではありません。しかし、あなたの場合、それは完全に動作します
myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
このソリューションは私に最適です:
private void showKeyboard(EditText editText) {
editText.requestFocus();
editText.setFocusableInTouchMode(true);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
editText.setSelection(editText.getText().length());
}
private void closeKeyboard() {
InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
これを試して...
キーボードを表示するため
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
キーボードを隠す
InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
ボタンクリックイベントでこのコードを使用します
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
クラッシュヌルポイントの例外の修正:ユーザーがボタンをクリックしてもキーボードが開かない場合がありました。 getCurrentFocus()がnullでないことを確認するには、ifステートメントを記述する必要があります。
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(getCurrentFocus() != null) {
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Kotlinの例:
val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
フラグメントから:
inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
アクティビティから:
inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)