【问题标题】:navigation drawer hide keyboard when onDrawerOpened导航抽屉在onDrawerOpened时隐藏键盘
【发布时间】:2013-07-07 20:03:31
【问题描述】:

我有一个带有编辑文本的片段。 当我单击edittext时,键盘出现。 问题是当我打开抽屉时,抽屉并没有隐藏键盘。 即使我切换到另一个片段,键盘仍然显示。 打开抽屉时如何隐藏键盘。

我试着放

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

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

两者都不隐藏键盘。

【问题讨论】:

    标签: android navigation-drawer


    【解决方案1】:

    在打开/关闭滑动抽屉之前使用这行代码:

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

    【讨论】:

    • 在使用Fragments(位于NavigationDrawerViewPager)时,我总是无法从EditText 获取WindowTokenActivity.getCurrentFocus() 是我错过的一件事。非常感谢。
    • 同意。 DrawerListener 中使用的其他 hideKeyboard() 方法与某种形式的焦点调整结合使用,在打开 NavDrawer 时仍会以某种方式显示键盘。这是唯一对我有用的变体。它基本上结合了我尝试过的努力,但没有成功,分别做。
    【解决方案2】:

    试试这个...

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

    【讨论】:

    • 您好,先生,如果 (drawer != null) {drawer.setDrawerListener(toggle); 它给了我一个空指针异常隐藏键盘(这个);我无法使用 appcompatv7 在 android studio 中对 ActionBarDrawerToggle 进行任何更改。请帮忙
    • 请检查您的 ActionBarDrawerToggle 监听器对象,如果没有正确实现可能会出现空指针异常。
    【解决方案3】:

    设置 drawer listener 已被弃用,您可以使用 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);
    
        }
    });  
    

    【讨论】:

      【解决方案4】:

      我创建了自己的 Helper 类来显示或隐藏键盘。

      这里是……

      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 指的是活动。

      【讨论】:

        【解决方案5】:

        这是迄今为止我提出的最简单的最佳解决方案。您所要做的就是创建一个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) {
                }
            });
        

        【讨论】:

          【解决方案6】:

          问题是getWindowToken() 必须从当前“持有”键盘的视图中调用。这很烦人,我同意你的观点,但这就是它的工作原理。

          例如,假设EditText mEditText 是当前焦点所在的对象,接收键盘击键。那么您的代码将是:

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

          【讨论】:

            【解决方案7】:

            如果您使用带抽屉的切换开关,则在您的 onCreate 方法中手动添加 onDrawerStateChanged

             DrawerLayout drawer = findViewById(R.id.drawer_layout);
                    //ActionBarDrawerToggle toggle = 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();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-23
              • 1970-01-01
              • 2020-09-12
              • 2015-11-04
              • 1970-01-01
              • 1970-01-01
              • 2020-12-29
              相关资源
              最近更新 更多