질문 : 프로그래밍 방식으로 Android 소프트 키보드를 어떻게 닫거나 숨기나요?
EditText
와 Button
이 있습니다.
편집 필드에 글을 쓰고 Button
클릭 한 후 키보드 외부를 터치 할 때 가상 키보드를 숨기고 싶습니다. 나는 이것이 간단한 코드라고 가정하지만 그 예제는 어디에서 찾을 수 있습니까?
답변
이 광기를 명확히하기 위해 먼저 모든 Android 사용자를 대신하여 소프트 키보드에 대한 Google의 우스꽝스러운 처리에 대해 사과하는 것으로 시작하겠습니다. 동일한 간단한 질문에 대해 서로 다른 답변이 너무 많은 이유는이 API가 Android의 다른 많은 사람들과 마찬가지로 끔찍하게 설계 되었기 때문입니다. 나는 그것을 표현하는 정중 한 방법이 없다고 생각할 수 있습니다.
키보드를 숨기고 싶습니다. Android에 다음 문을 제공 할 것으로 예상합니다. Keyboard.hide()
. 끝. 대단히 감사합니다. 하지만 안드로이드에는 문제가 있습니다. 키보드를 숨기려면 InputMethodManager
를 사용해야합니다. 좋습니다. 이것은 키보드에 대한 Android의 API입니다. 그러나! IMM에 액세스하려면 Context
이제 문제가 생겼습니다. Context
사용하거나 필요하지 않은 정적 또는 유틸리티 클래스에서 키보드를 숨기고 싶을 수 있습니다. 또는 더 나쁜 것은 IMM에서 키보드를 숨기려는 View
(또는 더 나쁜 경우에는 어떤 Window
이것이 키보드 숨기기를 어렵게 만드는 이유입니다. Dear Google : 내가 케이크의 레시피를 찾을 때, 내가 먼저 케이크를 먹을 사람과 먹을 곳이라고 대답하지 않는 한 레시피 제공을 거부하는 RecipeProvider
이 슬픈 이야기는 추악한 진실로 끝납니다. Android 키보드를 숨기려면 Context
View
또는 Window
두 가지 식별 형식을 제공해야합니다.
Activity
에서 호출하면 작업을 매우 견고하게 수행 할 수있는 정적 유틸리티 메서드를 만들었습니다.
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Activity
에서 호출 될 때만 작동합니다! 위의 메소드는 적절한 창 토큰을 가져 오기 위해 대상 Activity
getCurrentFocus
DialogFragment
호스팅 된 EditText
에서 키보드를 숨기고 싶다고 가정 해 보겠습니다. 위의 방법을 사용할 수 없습니다.
hideKeyboard(getActivity()); //won't work
Fragment
가 표시되는 동안 포커스 제어가없는 Fragment
의 호스트 Activity
대한 참조를 전달하기 때문에 작동하지 않습니다! 와! 따라서 조각에서 키보드를 숨기려면 더 낮고 일반적이며 추악한 수준에 의존합니다.
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
다음은이 솔루션을 찾는 데 더 많은 시간을 낭비하여 얻은 몇 가지 추가 정보입니다.
windowSoftInputMode 정보
알아야 할 또 다른 논쟁 점이 있습니다. 기본적으로 Android는 첫 번째 EditText
Activity
포커스 가능한 컨트롤에 초기 포커스를 자동으로 할당합니다. 당연히 InputMethod (일반적으로 소프트 키보드)가 자신을 표시하여 포커스 이벤트에 응답합니다. windowSoftInputMode
의 속성 AndroidManifest.xml
로 설정하면, stateAlwaysHidden
이 자동으로 할당 된 초기 초점을 무시하는 키보드를 지시합니다.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
거의 믿을 수 없을 정도로 컨트롤을 터치 할 때 키보드가 열리지 않도록 아무것도하지 않는 것 같습니다 ( focusable="false"
및 / 또는 focusableInTouchMode="false"
가 컨트롤에 할당되지 않은 경우). 분명히 windowSoftInputMode 설정은 자동 초점 이벤트에만 적용되며 터치 이벤트에 의해 트리거 된 초점 이벤트에는 적용되지 않습니다.
따라서 stateAlwaysHidden
은 실제로 이름이 매우 잘못되었습니다. ignoreInitialFocus
를 호출해야합니다.
업데이트 : 창 토큰을 얻는 더 많은 방법
초점이 맞춰진 뷰가없는 경우 (예 : 방금 조각을 변경 한 경우 발생할 수 있음) 유용한 창 토큰을 제공하는 다른 뷰가 있습니다.
위 코드의 대안 if (view == null) view = new View(activity);
이것은 당신의 활동을 명시 적으로 언급하지 않습니다.
조각 클래스 내부 :
view = getView().getRootView().getWindowToken();
fragment
이 매개 변수로 주어지면 :
view = fragment.getView().getRootView().getWindowToken();
콘텐츠 본문에서 시작 :
view = findViewById(android.R.id.content).getRootView().getWindowToken();
업데이트 2 : 백그라운드에서 앱을 열면 키보드가 다시 표시되지 않도록 포커스를 지 웁니다.
메소드 끝에 다음 행을 추가하십시오.
view.clearFocus();
출처 : https://stackoverflow.com/questions/1109022/how-do-you-close-hide-the-android-soft-keyboard-programmatically
'프로그래밍 언어 > Android' 카테고리의 다른 글
Android Studio의 Gradle은 무엇인가? (0) | 2021.07.02 |
---|---|
환경 설정 요약에서 Android 환경 설정의 현재 값을 표시하는 방법 (0) | 2021.06.30 |
Android에서 SQLite의 모범 사례 (0) | 2021.06.29 |
Android에서 Fragment에 옵션 메뉴를 추가하는 방법 (0) | 2021.06.27 |
안드로이드에서 프로그래밍 방식으로 화면 밀도를 얻는 방법 (0) | 2021.06.26 |