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);
이 코드 한 줄을 추가해주면 된다.