새로운 Task를 생성할때 가장 먼저 하는 일은 Task의 제목을 입력하는 것이다.
오늘 구현할 기능은 Task Add모드로 진입시에 제목을 빠르게 입력할 수 있도록 Keypad를 자동으로 띄워주는 기능이다.
AddEditTaskFragment에 진입했을 경우 자동으로 키패드를 보여준다.
그리고 바로 제목을 입력할 수 있도록 도와준다.
반대로 AddEditTaskFragment에서의 작업을 마친 경우 키패드를 숨겨야한다.
그리고 키패드가 화면의 많은 부분을 차지하여 EditText에 정보를 입력하는 경우를 제외하고는 사용에 불편함을 주기 때문에.
다른 메뉴 항목을 선택했을 경우에도 키패드는 숨겨져야한다.
Keypad Control
키패드를 관리하기 위해서 KeypadUtils라는 클래스를 독립적으로 생성했다.
Keypad는 InputMethodManager를 이용해서 조작할 수 있다.
먼저 keypad를 보여줘야하는 순간은 딱 한번이다. 바로 AddFargment가 AddMode로 실행되었을때이다.
그리고 keypad가 보여지는데 실패하더라도 큰 문제가 없다. 다시 EditText를 클릭함으로써 keypad를 띄울 수 있다.
하지만 keypad를 숨겨야하는 순간은 여러 상황이 있다. 그리고 keypad는 반드시 숨겨져야한다.
그래서 showKeypad를 위해서는 toggleSoftInput메소드를 사용해서 보여주고,
hideKeypad는 hideSoftInputFromWindow(WindowToken, Flag)를 사용해서 강제적으로 숨겨지도록 구현했다.
toggleSoftInput은 현재 InputMethod의 상태를 확인하고 toggle(2가지 상태를 On/Off) 시켜주는 메소드이다.
AddFragment로 화면전환이 이루어질때 Keypad는 당연히 hide상태이다.
그러므로 toggleSoftInput을 실행함으로써 View에 대한 어떤 레퍼런스도 얻지 않고도 keypad를 보여줄 수 있다.
hideKeypad는 keypad가 보여지고 있는 상황에서 혹은 보여지고 있지 않은 상태에서도 실행될 수 있기 때문에 toggle로 구현한다면 문제가 발생할 수 있다.
예를 들어 현재 keypad가 보여지지 않은 상태에서 Fragment를 벗어나서 toggle이 실행된다면 keypad가 보여지게 될 것이다.
그러므로 ViewToken값을 가지더라도 강제적으로 일관되게 hide기능을 수행하는 hideSoftInputFromWindow() 메소드를 사용해서 구현한다.
Activity가 실행된 이후에 Input이 의미가 있으므로 DI는 ActivityModule에 추가하였고,
Activity 위에서 실행되는 모든 Fragment에서 사용할 수 있도록 의존성주입을 설정하였다.
AddEditTaskFragment내에서는 Fragment 시작시 addMode인 경우 showKeypad()하고,
onPause(), fab.onClick() 등 keypad가 숨겨져야하는 상황에서 hideKeypad()를 적용하였다.
'Android' 카테고리의 다른 글
Logic 분리하기 (0) | 2019.11.01 |
---|---|
EditText Scrollable (0) | 2019.10.25 |
NavIndicator와 NavigationUp (0) | 2019.10.25 |
FloatingActionButton Anchor to Appbar (0) | 2019.10.08 |
Navigation Component 사용하기 (0) | 2019.10.03 |