フラグメントのあるアクティビティがあります。物事のリストを含むリストフラグメントとしましょう。ここで、ユーザーにモノを追加させたいので、FragmentManagerを使用して、リストフラグメントをEditTextを持つ挿入フラグメントに置き換えます。 EditTextにフォーカスがあり、カーソルが点滅しています。しかし、ソフトキーボードは開きません。逆も同じです。ユーザーが新しいものを入力してリストに追加した場合、挿入フラグメントをリストフラグメントに置き換えます。しかし、EditTextはもうありませんが、キーボードは閉じません。
これを実装する正しい方法は何ですか?すべてのトランジションでキーボードを手動で表示および非表示にする必要があるとは思えません!?
私は次のことをしたいと思います:
1。 Fragment
クラスを拡張する
2。 onAttach()
およびonDetach()
コールバックをオーバーライドする
3。ソフトウェアキーボードメソッドの表示と非表示を実装する
サンプルコード:
class MyFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//show keyboard when any fragment of this class has been attached
showSoftwareKeyboard(true);
}
@Override
public void onDetach() {
super.onDetach();
//hide keyboard when any fragment of this class has been detached
showSoftwareKeyboard(false);
}
protected void showSoftwareKeyboard(boolean showKeyboard){
final Activity activity = getActivity();
final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS);
}
}
キーボードを表示するには:
editText.requestFocus();
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(editText, 0);
それを隠すには:
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
私のアプリにも同じ問題があり、最後に2つのオプションがあります。最初に一般的な関数を作成し、これをすべての遷移で呼び出すか、グローバル遷移を作成します。
public static void RemoveAndReplaceFragment(FragmentManager fragmentManager, int FragmentContent, Fragment PlaceHolderFragment,Activity context){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frgMainActivity))
.commit();
//Close keyBoard in transition
InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.animation_fade_in,R.anim.animation_fade_out);
fragmentTransaction.replace(R.id.frgMainActivity, new PlaceholderFragment_MainActivity_AcceptAndFollowTask()).commit();
}
}
最善の方法は移行イベントをキャプチャすることですが、現時点ではできません...お手伝いできるかどうか教えてください、頑張ってください!
これは確実に機能します:
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
private void showKeyboard(){
EditText myEditText = (EditText) findViewById(R.id.myEditText);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
}
あなたのListView
があなたのEditText
の焦点を盗んでいると思います。これを試して、それが役に立ったかどうかをお知らせください。
getListView().setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
以下のコードを使用して、ソフトキーボードを非表示にできます。
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
これを試して
InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
私も同意します。キーボードを手動で非表示にする必要があるとは信じられませんでした。
これをフラグメントonCreateに追加して、キーボードを入れたくない場合:
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(mToolbar.getWindowToken(), 0);
mToolbarをレイアウト内の任意のビューに変更します。この場合、ツールバーを使用しました。
これを、キーボードを表示するフラグメントonCreateに追加します。
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);