web-dev-qa-db-ja.com

onDrawerOpenedの場合、ナビゲーションドロワーはキーボードを非表示にします

Edittextを含むフラグメントがあります。編集テキストをクリックすると、キーボードが表示されます。問題は、引き出しを開いたときに、引き出しがキーボードを隠さないことです。別のフラグメントに切り替えても、キーボードにはまだ表示されます。引き出しを開いたときにキーボードを非表示にするにはどうすればよいですか。

入れてみます

InputMethodManager imm = 
                        (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getWindowToken(), 0);

そして

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

どちらもキーボードを隠しません。

19
SooCheng Koh

スライドドロワーを操作/閉じる前に、このコード行を使用してください

InputMethodManager inputMethodManager = (InputMethodManager)  this.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
28
Ramz

これを試して...

@Override
protected void onCreate(Bundle savedInstanceState) {
    ......

    //Initialize
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    //Setting the actionbarToggle to drawer layout
    drawerLayout.setDrawerListener(actionBarDrawerToggle);

    //calling sync state is necessay or else your hamburger icon wont show up
    actionBarDrawerToggle.syncState();

}

DrawerListerner

 ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.app_name, R.string.app_name) {

        @Override
        public void onDrawerClosed(View drawerView) {
            // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
            super.onDrawerClosed(drawerView);
            InputMethodManager inputMethodManager = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank
            super.onDrawerOpened(drawerView);
            InputMethodManager inputMethodManager = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    };

ハッピーコーディング...

28

セットドロワーリスナーはすでに非推奨ですmDrawerLayout.addDrawerListener()を使用してナビゲーションドロワーの状態変化を検出し、キーボードonDrawerStateChangeを閉じることができます

mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {

    @Override
    public void onDrawerSlide(View drawerView, float slideOffset) {
        //Called when a drawer's position changes.

    }

    @Override
    public void onDrawerOpened(View drawerView) {
        //Called when a drawer has settled in a completely open state.
        //The drawer is interactive at this point.
        // If you have 2 drawers (left and right) you can distinguish 
        // them by using id of the drawerView. int id = drawerView.getId(); 
        // id will be your layout's id: for example R.id.left_drawer            
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        // Called when a drawer has settled in a completely closed state.
    }

    @Override
    public void onDrawerStateChanged(int newState) {
        // Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.
        InputMethodManager inputMethodManager = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

    }
});  
6
Karan sharma

問題は、現在キーボードを「保持」しているビューからgetWindowToken()を呼び出す必要があることです。それは非常に迷惑です、私はあなたに同意します、しかしそれはそれがどのように機能するかです。

たとえば、EditText mEditTextは、キーボードのキーストロークを受信して​​現在フォーカスされているオブジェクトです。したがって、コードは次のようになります。

 InputMethodManager imm = 
                    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);

それが役に立てば幸い。

1
Budius

**ドロワーでトグルを使用した場合は、onCreateメソッドにonDrawerStateChangedを手動で追加します**

DrawerLayoutドロワー= findViewById(R.id.drawer_layout); // ActionBarDrawerToggleトグル= new ActionBarDrawerToggle(this、drawer、appToolBar、R.string.Open_Drawer、R.string.Close_Drawer);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, appToolBar, R.string.app_name, R.string.app_name) {

        @Override
        public void onDrawerClosed(View drawerView) {
            // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
            super.onDrawerClosed(drawerView);
           /* InputMethodManager inputMethodManager = (InputMethodManager)  getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    */    }

        @Override
        public void onDrawerOpened(View drawerView) {
            // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank
            super.onDrawerOpened(drawerView);
          /*  InputMethodManager inputMethodManager = (InputMethodManager)  getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
   */     }

        @Override
        public void onDrawerStateChanged(int newState) {
            // Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.
            InputMethodManager inputMethodManager = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

        }
    };




    drawer.addDrawerListener(toggle);

    toggle.syncState();
0
Amit Chavan

これは私がこれまでに思いついた単純な最良の解決策です。あなたがしなければならないのはInputMethodManagerオブジェクトを作成することだけです。リスナーをDrawerLayoutオブジェクトに追加し、最後に次のメソッドinputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0);にコード行を追加します。

InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);

    drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(@NonNull View view, float v) {
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0);
        }
        @Override
        public void onDrawerOpened(@NonNull View view) {
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0);
        }

        @Override
        public void onDrawerClosed(@NonNull View view) {
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0);
        }

        @Override
        public void onDrawerStateChanged(int i) {
        }
    });
0
Nelson Katale

キーボードを表示または非表示にする独自のヘルパークラスを作成します。

ここにあります...

_public static class Helper {

    public static void showKeyboard(Activity activity) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.showSoftInput(activity.getCurrentFocus(), InputMethodManager.SHOW_IMPLICIT);
        }
    }

    public static void hideKeyboard(Activity activity) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null && activity.getCurrentFocus() != null) {
            imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }

}
_

Helper.showKeyboard(this)を呼び出して、キーボードを表示します。キーボードを非表示にするには、Helper.hideKeyboard(this)を呼び出します。 thisはアクティビティを指します。

0
Afrig Aminuddin