728x90
InputMethodManager imm;
imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

이 3줄이면 소프트 키보드를 숨길 수 있다.

 

나는 주로 InputMethodManager 변수를

InputMethodManager imm;

이렇게 전역변수(클래스의 멤버변수)로 선언해놓고

 

onCreate() 메소드 안에서

imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 

이렇게 초기화 해주고

 

필요한 부분에

imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

이 코드를 넣어준다.

 

필요한 부분이란 대부분 onClick()메소드 안이다.

EditText에 뭔가를 입력하고 입력을 완료했을 때 누르는 그 버튼의 OnClickListener에 넣어주는 것이 일반적이다.

입력을 다 끝냈으니 이제 키보드가 필요없기 때문이다.

 

그런데 오늘은 onClick()메소드가 아닌 곳에서 키보드를 숨길 필요가 있었다.

 

EditText에 뭔가를 입력하다가 네비게이션 드로어(Navigation Drawer)를 열어야 하는 일이 있을 수도 있다.

그 때 키보드가 사라지지 않는다면

이렇게 드로어가 가려져서 사용하기에도 불편하고 보기에도 좋지 않은 상황이 발생한다.

 

네비게이션 드로어가 있는 액티비티를 만들었다면 MainActivity.java 파일에 이 코드가 있을 것이다.

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);

drawer.addDrawerListener(toggle); 이라고 한 것을 보니 toggle은 리스너 객체인데 아무리 봐도 이벤트 핸들러 메소드를 추가할 수 있는 곳이 없어 보인다.

 

그냥 이렇게 해주면 된다.

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close){
            @Override
            public void onDrawerOpened(View drawerView) {
                imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
            }
        };
drawer.addDrawerListener(toggle);

괄호 뒤에 중괄호를 열어주면 된다. 그러고 나서 alt+insert로 필요한 메소드를 오버라이딩하면 된다.

나는 드로어가 열렸을 때 키보드를 숨기고 싶어서 onDrawerOpened() 메소드 안에

imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

이 코드 한 줄만 추가해줬다.

그랬더니 드로어를 열면 키보드가 자동으로 숨겨져서 훨씬 보기 좋아졌다.

 

반대로 키보드를 보이게 하고 싶으면

imm.showSoftInput(editText, 0);

이 코드 한 줄을 추가해주면 된다.

728x90

+ Recent posts