Tmi 4 keyboard?fm=jpg&fl=progressive&q=75&w=300

iOS와 Android에서가상 키보드를 사라지게 하기

TMI에서 Michael Helmbrecht은 인기있는 모바일 질문에 대해서 자세하게 답변을 합니다.

지금까지 인기있는 답을 찾기위해 웹을 뒤적거렸나요? 사용자가 앱의 컨텐츠를 자세하게 볼 수 있게 안드로이드와 iOS에서 거슬리는 키보드를 코드로 숨기는 방법을 설명합니다.


안녕하세요 저는 Realm에서 일하는 Michael입니다. 오늘은 안드로이드와 iOS 앱을 개발하면서 많이 나오는 질문인 ‘어떻게 가상 키보드를 사라지게 할까?’ 에 대한 답을 하려고 합니다.

가상 키보드는 종종 화면의 일부를 가려 사용성을 해칩니다. 키보드를 숨기면 사용자가 앱에서 더 많은 내용을 볼 수 있습니다. 자바와 오브젝티브-C, 스위프트에서 빠르게 이 문제를 해결하는 방법에 대해서 알아보겠습니다.

Android

키보드를 사라지게 하는 것은 안드로이드에서는 어렵지 않습니다. 아래의 코드를 보면 간단한 두 라인을 볼 수 있습니다.

이런 개발 뉴스를 더 만나보세요

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

InputMethodManager에서 참조하여 얻은 getSystemService를 사용할 수 있습니다. 즉, 키보드를 추적하는 객체입니다. 어떤 하드웨어 장치를 가지고 있다고 해도 키보드 뿐만 아니라 많은 것을 관리 할 수 있습니다. 그런 다음 hideSoftInputFromWindow 메소드를 호출하면 됩니다.

중요한 것은 토큰이 필요한데 아래에서 조금더 이야기를 해볼겁니다. 토큰에서 전달하고 옵션 플레그가 0으로 전달합니다. 토큰 주위를 조금 살펴보면, 현재 포커스 뷰를 얻어서 이를 사용하면 됩니다.

View view = this.getCurrentFocus();
if (view != null) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

보고자 하는 뷰를 가지기 위해 getCurrentFocus를 메소드가, null인지 체크해야합니다. 이는 InputMethodManager를 전달하기 위해 필요한 윈도우 토큰을 얻는 방법입니다.

또 다른 방법은 InputMethodManager.HIDE_IMPLICIT_ONLY로 옵션 플래그 0을 대체하는 방법이 있습니다.

View view = this.getCurrentFocus();
if (view != null) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
}

이 코드는 암묵적으로 올라온 (자동으로 올라온) 키보드를 숨길 것입니다. 만약 사용자가 EditText를 클릭한다면 즉, 사용자가 키보드가 보여지기 원하는 명시적인 행동을 한 경우에도 우리가 명시적으로 키보드를 숨겼기 때문에 이 메소드는 어떤 일도 발생 시키지 않을 것입니다. 하지만, 백그라운드에서 다른 종류의 프로세스가 있거나, 어떤 경우에서건 암묵적으로 포커스를 얻었다던지(사용자가 요청한 것이아닌) 하는 다른 메커니즘이 있다면 키보드가 보여질 것입니다.

이 플래그는 키보드를 사용자가 원할때 보여주는 경우 등에 사용할 수 있지만 여러 프로세스에서 간섭이 일어나 예기치 않은 동작을 불러오기도 합니다.

iOS

iOS는 실제로 더 쉽습니다. 코드 한 줄이면 됩니다.

Objective-C

[self.view endEditing:YES];

Swift

self.view.endEditing(true);

어느 뷰에서나 endEditing을 호출할 수 있고 오브젝티브-C에서는 YES, 스위프트에서는 true를 전달할 수 있습니다. 그 YES(또는 true)는 강제적인 불리언입니다. 이는 첫번째 응답자가 무엇을 하든 강제로 할 수 있습니다. 이것은 자동적으로 조사하고 응답자가 키보드를 위로 하고, 사라지게 하는 것을 알아냅니다.

많이 사람들이 하위 계층 구조를 통해 이를 반복하는 글들을 인터넷에서 봤습니다. 하지만 그렇게 할 필요 없습니다. endEditing라고 하는 것이 이미 알아서 해줄 것입니다. 원하는 뷰에서 키보드를 이동하고 싶으면 부르면 됩니다.

더 알아보기

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

Michael Helmbrecht

Michael은 주간에는 디자이너, 야간에는 iOS 개발자로 활동합니다. 현재 Realm에서 최고의 디자인을 만들기 위해 디자인과 iOS 개발, 두 분야에서 공헌하고 있습니다. 또한 세계에서 가장 큰 Swift 모임인 SLUG의 저명한 주최자이기도 합니다.

4 design patterns for a RESTless mobile integration »

close