web-dev-qa-db-ja.com

表示/非表示Androidフラグメント置換時のソフトキーボード

フラグメントのあるアクティビティがあります。物事のリストを含むリストフラグメントとしましょう。ここで、ユーザーにモノを追加させたいので、FragmentManagerを使用して、リストフラグメントをEditTextを持つ挿入フラグメントに置き換えます。 EditTextにフォーカスがあり、カーソルが点滅しています。しかし、ソフトキーボードは開きません。逆も同じです。ユーザーが新しいものを入力してリストに追加した場合、挿入フラグメントをリストフラグメントに置き換えます。しかし、EditTextはもうありませんが、キーボードは閉じません。

これを実装する正しい方法は何ですか?すべてのトランジションでキーボードを手動で表示および非表示にする必要があるとは思えません!?

23
Maniac

私は次のことをしたいと思います:

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);
   }
}
7
bpawlowski

キーボードを表示するには:

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);
5
Jeremy Dowdall

私のアプリにも同じ問題があり、最後に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);
   }
1

あなたのListViewがあなたのEditTextの焦点を盗んでいると思います。これを試して、それが役に立ったかどうかをお知らせください。

getListView().setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
0
Bojan Kseneman

以下のコードを使用して、ソフトキーボードを非表示にできます。

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
0
Durgesh

これを試して

InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    editText.requestFocus();
0
gunjan luthra

私も同意します。キーボードを手動で非表示にする必要があるとは信じられませんでした。

これをフラグメント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);
0
Eugene H