안드로이드 소프트 키보드 닫기 / 숨기기


3818

나는이 EditTextButton내 레이아웃을.

편집 필드에 쓰고를 클릭하면 Button가상 키보드를 숨기고 싶습니다. 나는 이것이 간단한 코드 조각이라고 가정하지만 그 예제는 어디에서 찾을 수 있습니까?

키보드 외부를 만질 때.


13
확인란 및 라디오와 같이 EditText가 하나만 있고 몇 개의 단추가 있으면 어떻게합니까? 키보드가 필요한 유일한 곳은 단일 EditText에 있습니다. 키보드를 숨기기 위해 다른 항목을 선택하거나 클릭했다는 것을 어떻게 알 수 있습니까?
AlikElzin-kilaka 2016 년

14
내 자신이 멍청하게 느껴진다. ICS에서 키보드를 숨길 수 없습니다. 여기에있는 모든 방법과 그 조합을 시도했습니다. 절대 안돼. 그것을 보여주는 방법은 효과가 있지만, 어떤 바람을 피우는가, 깃발을 숨기거나, 성도 설정 또는 성도에게 양초를 불문하고 숨길 수는 없습니다. inputType는 = 0x00000000의 대해서는 imeOptions = 0x00000000의 : I / LatinIME는 (396) : InputType.TYPE_NULL이 / LatinIME W 지정 (396) : 예기치 않은 입력 클래스는 키보드 쇼에 나는 항상이 볼
rupps

4
/ ** *이 방법은 소프트 키보드를 숨기는 데 사용됩니다. * @param activity * / public void hideSoftKeyboard (Activity activity) {InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService (Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow (activity.getCurrentFocus (). getWindowToken (), 0); }
Harshal Benake

이것은 나를 위해 일했다
nmxprime

장치의 화면 크기와 해상도가 증가함에 따라 가상 키보드 숨기기가 덜 중요 해지고 있습니다.
Al-Kathiri Khalid

답변:


2034

이 광기를 명확히하기 위해 모든 안드로이드 사용자를 대신하여 Google의 소프트 키보드에 대한 우스꽝스러운 대우에 대해 사과하고 싶습니다. 동일한 간단한 질문에 대해 서로 다른 많은 답변이있는 이유는 안드로이드의 다른 많은 사람들과 마찬가지로이 API는 끔찍하게 설계 되었기 때문입니다. 나는 그것을 정중하게 표현할 방법이 없다고 생각할 수 있습니다.

키보드를 숨기고 싶습니다. Android에 다음 진술을 제공 할 것으로 예상됩니다 Keyboard.hide(). 끝. 대단히 감사합니다. 그러나 안드로이드에 문제가 있습니다. InputMethodManager키보드를 숨기려면를 사용해야합니다 . 자, 이것은 키보드에 대한 안드로이드의 API입니다. 그러나! ContextIMM에 액세스 하려면을 가지고 있어야합니다 . 이제 문제가 있습니다. 사용하지 않거나 필요로하는 정적 또는 유틸리티 클래스에서 키보드를 숨기고 싶을 수도 있습니다 Context. 나 그리고 훨씬 더의 IMM은 당신이 무엇을 지정해야합니다 View(또는 더 나쁜, 무엇을 Window) 당신이에서 키보드를 숨길.

이것이 키보드를 숨기는 것이 어려운 일입니다. 친애하는 Google : 케이크를 만들기위한 레시피를 찾을 때, RecipeProvider누가 WHO에게 케이크를 먹을 것인지 그리고 어디서 먹을지를 대답하지 않으면 레시피를 제공하지 않을 지구상 이 없습니다 !!

이 슬픈 이야기는 추악한 진실로 끝납니다 .Android 키보드를 숨기려면 a Context와 a View또는 a의 두 가지 형태의 식별을 제공해야 합니다 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! 에서 호출 될 때만 작동합니다 . 위 getCurrentFocus의 대상의 메소드 호출Activity 는 적절한 창 토큰을 가져 오기 위해 을 .

그러나 EditText호스트에서 키보드를 숨기고 싶다고 가정 해보십시오 DialogFragment. 위의 방법을 사용할 수 없습니다.

hideKeyboard(getActivity()); //won't work

Fragment의 호스트에 대한 참조를 전달하기 때문에 작동하지 않습니다. 호스트 가 표시되어있는 Activity동안 집중 제어가 불가능합니다 Fragment! 와! 따라서 조각에서 키보드를 숨기려면 하위 레벨, 더 일반적이며 더 못생긴 방법을 사용합니다.

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();


2
아주 좋은 글씨. 그러나 한 가지, 그 위에서 다른 활동을 시작하여 키보드를 트리거하는 경우 키보드를 다시 표시해도 여전히 존재합니다. 주요 활동을 종료 할 때 방법을 사용하여 키보드를 제거하여 수정했습니다.
Oyvind

3
@rmirabelle Fragment그것은 당신이 사용할 수 있는 것 같습니다getActivity().getWindow().getDecorView()
McX

1
이 게시물은 훌륭하지만 두 가지 중요한 부분이 부족합니다. 버전 및 제조마다 미묘한 변경이 이루어집니다. 예를 들어 삼성 은하에없는 키보드가 여전히 글고의 두 번째 클릭에 나타납니다 경우 우리가 ... 키보드를 숨기기 전에 .clearFocus ()를 사용할 필요가 S6 : S를
Warpzit을

17
구글은 그 Keyboard.hide();유틸리티를 제공해야한다
HendraWD

1
[someView] .getContext () << 활동 일 수 있습니다. 항상 같은 개체입니다. (내부 서비스 제외 ...)
Oliver Dixon

4417

InputMethodManager를 사용하여 Android가 가상 키보드를 숨기도록 강제 할 수 있습니다 .를 호출 hideSoftInputFromWindow하면 포커스 된 뷰가 포함 된 창의 토큰이 전달됩니다.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

이렇게하면 모든 상황에서 키보드가 숨겨집니다. 어떤 경우에는InputMethodManager.HIDE_IMPLICIT_ONLY경우에 따라 사용자가 키보드를 명시 적으로 표시하지 않은 경우 (메뉴를 누르고 있음) 키보드를 숨기도록 두 번째 매개 변수로 수 있습니다.

참고 : Kotlin에서이 작업을 수행하려면 다음을 사용하십시오. context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

코 틀린 구문

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager 
  imm?.hideSoftInputFromWindow(v.windowToken, 0)
 }

14
감사합니다. 두 번째 매개 변수로 0을 사용하면 훌륭하게 작동합니다. 그러나 InputMethodManager.HIDE_IMPLICIT_ONLY를 사용하면 키보드가 숨겨지지 않습니다 (메뉴를 누르고 있지는 않지만). 힌트가 있습니까?
RoflcoptrException

27
멋있는. 명확히하기 위해, 존재하는 경우에만 무시하지만 팝업되는 것을 막지 않습니다 .
Cheezmeister 2012

15
그것은 softInput를 숨기기 전에 editText.clearFocus ()를 호출하기 위해 유용하게 될 수있다
user2224350

111
호출 editText.clearFocus()InputMethodManager.HIDE_IMPLICIT_ONLY도 것은에서 작동4.1
sprocket12

11
무엇 4.4 / HTC에 나를 위해 일한 것은 실행 된 View focused = getCurrentFocus()것입니다 것을 얻을 확실히 호출, 현재 포커스보기 focused.clearFocus()다음과 inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(일반 플래그).
Ionoclast Brigham

805

소프트 키보드를 숨길 때도 유용합니다.

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);

사용자가 editText보기를 실제로 터치 할 때까지 소프트 키보드를 억제하는 데 사용할 수 있습니다.


116
매니페스트의 활동에 android : windowSoftInputMode = "stateHidden"을 추가하여 동일한 효과를 얻을 수도 있습니다.
BoD

7
API 레벨 9의 조각 (소유 활동 참조)에서 이것을 시도했지만 불행히도 작동하지 않았습니다. onResume 및 onActivityCreated에서 호출하려고 시도했지만 아무런 효과가 없습니다.
AgentKnopf

2
나는 대화 상자에서 일하고 있으며 이것이 효과가있었습니다. Android 3.2를 사용하고 있습니다. onCreateDialog (Bundle) 메소드에 넣었습니다. onCreate 메소드에서는 작동하지 않았습니다. 대화 상자 대화 상자 = super.onCreateDialog (savedInstanceState); dialog.getWindow (). setSoftInputMode (WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN); 결과적으로 EditTexts가있는 내보기는 키보드없이 나타납니다. 사용자가 편집 텍스트를 터치하면 키보드가 나타납니다.
flobacca

4
포커스가 여전히 EditText에있을 때 (예 : 버튼을 터치 한 후) 작동하지 않습니다. 이를 위해 Reto의 솔루션을 사용하십시오.
Noumenon

4
매니페스트 설정을 재정의하는 것이 나쁜 생각 인 이유는 무엇입니까? 나는 이것을 파편에서 불렀다. 프래그먼트에 적용되는 매니페스트 설정은 없습니다 ...
Greg Ennis

348

키보드를 숨기는 솔루션이 하나 더 있습니다.

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

여기서 전달 HIDE_IMPLICIT_ONLY의 위치 showFlag0의 위치 hiddenFlag. 소프트 키보드가 강제로 닫힙니다.


4
showflags 매개 변수에 hide 플래그를 사용하고 있습니다. 상수가 동일한 정수를 사용하기 때문에 작동합니다. 올바른 플래그를 사용하는 예
Alex

내가 초점을 가질 수있는 여러 편집 텍스트, 그 활동에 버튼이 있기 때문에 나는이 솔루션처럼, 안드로이드 4.0에서 테스트

32
@ 마크 : 방법은 없습니다 "hideSoftInput": "toggleSoftInput"이라고 때문에
Sver

19
이 솔루션은 키보드가 숨겨져 있으면 표시합니다. 그것은 정확하지 않습니다
Michael Katkov

1
@AkashAggarwal-키보드가 표시되어 있기 때문에 당신에게만 효과가 있다는 사실을 무시하면 "작동"합니다. (그것은 키보드의 가시성을 토글합니다 : 그것은 보여줄 때 숨겨 지지만 숨겨 졌을 때 보여줍니다!) 당신은 모든 상황에서 모든 장치에서 모든 미래 버전의 안드로이드에서 키보드가 작동하지 않을 것이라고 보증 할 수 있습니까? 당신이 이것을 호출 할 때 보여주는? 그렇다면 계속해서 사용하십시오!
ToolmakerSteve

148

Meier의 솔루션도 저에게 효과적입니다. 필자의 경우 내 앱의 최상위 레벨은 tabHost이며 탭을 전환 할 때 키워드를 숨기고 싶습니다-tabHost보기에서 창 토큰을 얻습니다.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

SearchView에서도 작동하도록했습니다. 내 대답은 아래를 참조하십시오. mckoss 감사합니다!
Azurespot

138

아래 코드에서 시도하십시오 onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

2
이 메소드는 code.google.com/p/android/issues/detail?id=7115 ... hidehideInputFromWindow 메소드에 설명 된대로 2.0 및 2.1의 "소프트 키보드를 숨길 수 없음"버그를 해결하는 수단으로 작동합니다. 시도했을 때 위에 나열된 작동하지 않지만 editView.setInputType (0)이 작동했습니다.
스파이크 윌리엄스

18
이 방법은 Javadoc에 따라 합법적입니다 (해킹 아님). editView.setInputType(InputType.TYPE_NULL);
Bostone

3
그러나 이것은 작동하지만 android : hint를 숨 깁니다. 저는 안드로이드 1.5를 사용하고 있습니다
Tirtha

이것은 대화 상자에서 키보드를 닫아야 할 때 유용합니다. 인스턴스 또는 다른 것을 얻을 필요가 없으며 사용자가 대화 상자를 닫는 버튼을 누를 때 모든 편집 텍스트에 이것을 지정할 수 있습니다.
I'm_With_Stupid

작동하지만 커서를 숨기고 있습니다. 커서가 필요하지만 시스템 키보드는 없습니다.
스테판 Brendle

128

업데이트 : 이 솔루션이 더 이상 작동하지 않는 이유를 모르겠습니다 (방금 Android 23에서 테스트했습니다). 대신 Saurabh Pareek 의 솔루션을 사용하십시오 . 여기있어:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

오래된 답변 :

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

8
이 코드를 어디에 배치해야합니까? getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 붙여 넣기를 시도했습니다. onCreate ()에서 키보드는 숨겨지지 않습니다
user2236096

작동하지 않으며 radioGroup.setOnCheckedChangeListener, API 23에서 테스트 됨
Christian Schäfer

자세히 살펴보면 InputMethodManager.HIDE_IMPLICIT_ONLY와 InputMethodManager.SHOW_IMPLICIT의 값이 "1"이므로이 호출간에 차이가 없습니다. => 작동하지 않음
Palejandro

imm.toggleSoftInput (InputMethodManager.HIDE_IMPLICIT_ONLY, 0)을 호출하는 경우; 키보드가 화면에 표시됩니다 :) 최상의 구현 방법은 다음과 같습니다. github.com/ravindu1024/android-keyboardlistener Android SDK의 수치심
Duna

I don't know why this solution is not work any more- 안드로이드 이기 때문에 모든 것이 바뀔 수 있습니다. 디자인이 잘못 되었을 수도 있습니다.
King King

88
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

5
이것은 나를 위해 일했다! 그러나 왜 input.setInputType (0) 을 넣었 습니까? 해당 코드 줄이있을 때 EditTextView 와 상호 작용할 수 없었 습니다 (제거 할 때 작동했습니다).
ymerdrengene

아마 input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE).
CoolMind

input.setInputType(0);이 코드에서 제거 했습니다. 그것은 키보드의 행동과 변화 inputType위해를 EditText.
CoolMind

73

여기에있는 다른 모든 답변이 원하는대로 작동하지 않으면 키보드를 수동으로 제어하는 ​​또 다른 방법이 있습니다.

EditText의 속성 중 일부를 관리하는 함수를 만듭니다 .

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

그런 다음 onFocus가 EditText키보드를 열고 닫는 지 확인하십시오 .

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

이제 키보드를 수동으로 열 때마다 다음을 호출하십시오.

setEditTextFocus(true);

그리고 전화를 끊기 위해 :

setEditTextFocus(false);

+1-닫힌 키보드로 활동을 시작하려면이 솔루션을 사용하고 setEditTextFocus (true)를 설정하는 onclicklistener를 추가하십시오. 참처럼 작동합니다!
schlingel

두 번째 코드 블록의 7 번째와 10 번째 줄에 '기호 컨텍스트를 해결할 수 없습니다'가 있습니다.
gimmegimme

대신 getContext ()를 사용하십시오
Rotemmiz

61

사우 라브 파릭 가 지금까지 가장 좋은 답변을 .

그래도 올바른 플래그를 사용할 수 있습니다.

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

실제 사용 예

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}

1
최신 버전에 가장 효율적입니다. 이전 버전의 경우 항상 조정해야합니다. 특히 v3 이전.
Alex

2
@Mazen : 사용fragment.getActivity().getSystemService();
Johan S

이것은 가장 포괄적 인 답변으로, 표시 및 숨기기를 모두 포함합니다.
André Staltz

4
아니요. 내 Samsung Tab, Android 5.0에서 위의 "키보드 숨기기"코드는 소프트 키보드를 전환합니다 (이미 숨겨진 키보드 인 경우 표시). 이 함수의 이름에 TOGGLE이있는 이유가 있습니다.
ToolmakerSteve

57

그래서 검색에서 나에게 맞는 답변을 찾았습니다.

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Android 5.1
GMX

55

짧은 대답

당신에 OnClick리스너 부르는 onEditorAction의를 EditText함께IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

드릴 다운

이 방법이 더 좋고 간단하며 Android의 디자인 패턴과 더 잘 어울린다고 생각합니다. 위의 간단한 예에서 (보통 대부분의 경우) EditText초점이 있고 일반적으로 키보드를 처음에 호출하는 것이 었습니다 (많은 사람들이 키보드를 호출 할 수 있음) 일반적인 시나리오). 같은 방법으로, 키보드를 분리 할 수있는 것이어야한다, 보통 있다는하여 수행 할 수 있습니다 ImeAction. EditTextwith의 android:imeOptions="actionDone"작동 방식 을 확인하고 동일한 방법으로 동일한 동작을 달성하려고합니다.


관련 답변 확인


이것이 답입니다. 버전 간 작동하는 유일한 방법입니다. 나는이 질문으로 돌아와서이 답변을 게시했습니다. 다른 사람이 알지 못했다고 생각합니다.
Noah Passalacqua

이것이 정답이어야합니다. 실제로 키보드를 숨기도록 Android를 속이는 대신 사용자가 키보드를 마치면 마치 사용자가 키보드에서 "완료"를 클릭 한 것처럼 동일한 ImeAction [stupid name, 인정]을 트리거한다고 알려줍니다. . 이렇게하면 사용자가 키보드 입력을 확인하거나 UI 버튼을 탭해도 아무런 차이가 없습니다.
Oliver Hausler

46

이것은 작동해야합니다 :

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

키보드가 숨겨져 있어도 부분적으로 작동했습니다. "isActive ()"는 false를 반환합니다!
xpto

물론 그렇습니다. 아니면 당신을 이해하지 못할 수도 있습니다. 어쨌든, 당신은을 가지는 클래스 보완 할 수 hide()show()이하지 않을 때 표시하고시기를보다 효율적으로 제어 할 방법을. :) 나는 예를 편집합니다 나를 위해 작품, 나도 그것을 않았다
slinden77

@YoushaAleayoub 그렇습니다. KeyBoard.toggle(fragment.getActivity())
slinden77

@ slinden77, lol, 나는 당신의 답변에 대해 이야기하고 있습니다 ... 그래서 그 대답은 여전히 ​​WONT 작업입니다.
Yousha Aleayoub

@YoushaAleayoub 어 그래 그래. 원래 질문은 조각을 언급하지 않으며 조각을 언급 한 사람입니다. 그래서 내 대답은 완벽하게 유효합니다. 프래그먼트와 함께 사용하려면 Fragment주석 처리 된 것처럼 메소드를 다르게 호출하십시오 . 방법을 사용하는 방법을 배우고 다시 오십시오. 당신은 당신의 어리석은 대답과 사람들을 혼동합니다
slinden77

43

IMM 키보드를 표시 할 수 없도록 사용자 정의 키보드를 사용하여 16 진수를 입력하고 있습니다 ...

v3.2.4에서는 setSoftInputShownOnFocus(boolean show)TextView에 포커스가있을 때 날씨를 제어하거나 키보드를 표시하지 않도록 추가되었지만 여전히 숨겨져 있으므로 반사를 사용해야합니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

이전 버전의 경우 루트 뷰 OnGlobalLayoutListener에서을 추가 ViewTreeObserver하고 키보드가 다음과 같이 표시되는지 확인하여을 사용하여 매우 좋은 결과 (그러나 완벽하지는 않음)를 얻었습니다 .

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

이 마지막 솔루션은 순간적으로 키보드를 표시하고 선택 핸들을 망칠 수 있습니다.

키보드가 전체 화면으로 들어가면 onGlobalLayout이 호출되지 않습니다. 이를 피하려면 TextView # setImeOptions (int) 또는 TextView XML 선언에서 사용하십시오.

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

업데이트 : 키보드를 표시하지 않고 모든 버전에서 작동하는 대화 상자를 찾았습니다.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

감사합니다. FLAG_ALT_FOCUSABLE_IM 및 FLAG_ALT_FOCUSABLE_IM 두 플래그는 실제로 내 경우에 도움이 된 유일한 것입니다. 사용자가 편집 텍스트를 클릭했을 때조차도 내 활동에 키보드를 표시하고 싶지 않았습니다. (내 자신의 "키패드"를 만들었습니다).
Daniel Novak

그러나 멋진 해결책이지만 전면 활동이 전체 화면이 아닌 경우 키보드가 후면에 보입니다. 또한 키보드의 커서 이동 보조 기능도 계속 볼 수 있습니다. 그리고 그것은 껍질을 벗길 수 없습니다.
halxinate

나는 두 번째입니다. 가능한 모든 방법 중 getWindow (). setFlags () 메서드 만 최소한 Android 5.1 이상에서 작동합니다. setSoftInputShownOnFocus ()는 이제 setShowSoftInputOnFocus ()이며 더 이상 숨겨지지는 않지만 최소한 사용자가 필드를 터치 할 때 작동하지 않습니다.
olefevre

귀하의 "업데이트"는 저에게 유일한 해결책이었습니다. 나는 해결책을 적어도에서 2 시간 :) 찾고 있어요
스테판 Brendle

33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

30

스레드에 게시 된 모든 솔루션을 작업하는 데 이틀 이상을 보냈으며 어떤 방식 으로든 부족한 것으로 나타났습니다. 정확한 요구 사항은 100 % 안정성을 갖춘 버튼을 사용하여 온 스크린 키보드를 표시하거나 숨기는 것입니다. 키보드가 숨겨진 상태 인 경우 사용자가 클릭 한 입력 필드에 관계없이 다시 나타나지 않아야합니다. 키보드가 보이는 상태에서 사용자가 어떤 버튼을 클릭하더라도 키보드가 사라지지 않아야합니다. 최신 기기까지 Android 2.2 이상에서 작동해야합니다.

내 앱 clean RPN 에서 작동하는 구현을 볼 수 있습니다 .

많은 다른 전화 (froyo 및 gingerbread 장치 포함)에서 제안 된 답변을 테스트 한 후 Android 앱이 안정적으로 다음을 수행 할 수 있음이 분명해졌습니다.

  1. 키보드를 일시적으로 숨 깁니다. 사용자가 새 텍스트 필드에 초점을 맞추면 다시 나타납니다.
  2. 활동이 시작될 때 키보드를 표시하고 활동에 키보드를 항상 표시해야 함을 나타내는 플래그를 설정하십시오. 이 플래그는 활동이 초기화 될 때만 설정할 수 있습니다.
  3. 키보드 사용을 보여 주거나 사용하지 않도록 활동을 표시하십시오. 이 플래그는 활동이 초기화 될 때만 설정할 수 있습니다.

나를 위해 키보드를 일시적으로 숨기는 것만으로는 충분하지 않습니다. 일부 장치에서는 새 텍스트 필드에 초점을 맞추 자마자 다시 나타납니다. 내 앱이 한 페이지에서 여러 텍스트 필드를 사용하므로 새 텍스트 필드에 초점을 맞추면 숨겨진 키보드가 다시 팝업됩니다.

불행히도 목록의 항목 2와 3은 활동이 시작될 때만 안정성을 작동합니다. 활동이 표시되면 키보드를 영구적으로 숨기거나 표시 할 수 없습니다. 요령은 사용자가 키보드 전환 버튼을 누를 때 실제로 활동을 다시 시작하는 것입니다. 사용자가 토글 키보드 버튼을 누르면 내 앱에서 다음 코드가 실행됩니다.

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

이로 인해 현재 활동의 상태가 번들에 저장된 다음 키보드가 표시되거나 숨겨져 야하는지 여부를 나타내는 부울을 통해 활동이 시작됩니다.

onCreate 메소드 내에서 다음 코드가 실행됩니다.

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

소프트 키보드가 표시되면 InputMethodManager에 키보드를 표시하라는 메시지가 표시되고 소프트 입력이 항상 표시되도록 창에 지시됩니다. 소프트 키보드를 숨기려면 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM이 설정됩니다.

이 방법은 안드로이드 2.2를 실행하는 4 년 된 HTC 전화에서 4.2.2를 실행하는 넥서스 7까지 내가 테스트 한 모든 장치에서 안정적으로 작동합니다. 이 방법의 유일한 단점은 뒤로 단추를 처리 할 때주의해야한다는 것입니다. 내 응용 프로그램에는 기본적으로 하나의 화면 (계산기) 만 있으므로 onBackPressed ()를 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.


1
정교한 해결 방법이지만 키보드를 숨기려면 수천 개의 객체를 재생성하는 것이 너무 많은 것 같습니다. 누가 안드로이드 용 IMM을 설계했는지는 모르겠지만 Windows APi 냄새가납니다. 제 생각에는 좋은 IME에는 두 가지 방법이 있어야합니다. hide and show :-)
rupps

모두 사실이지만 내 해결 방법에는 한 가지 장점이 있습니다. 항상 작동합니다! UI에서 어떤 필드에 포커스가 있는지, 사용자가 토글 및 키보드로 수행 한 작업, 실행중인 Android 버전에 관계없이 항상 키보드를 토글하는 다른 솔루션은 없습니다.-\
Luke Sleeman

남자, 난 키보드를 숨기는 게 필사적이야. 수천 가지 일을 시도하고 누가 일을했는지. 그러나 귀하의 해결 방법은 나에게 너무 많습니다 .10 조각처럼 다시 작성하고 서비스를 초기화하고 많은 WeakReferences를 삭제해야합니다 .... 알고 있습니까? GC는 25mb처럼 버릴 것입니다 : S ... 여전히 믿을만한 방법을 찾고 있습니다 :(
rupps

@Dmitry 잘 안녕하세요 세상이 아닙니다 ... 태블릿을위한 복잡한 응용 프로그램입니다. 나는 어리석은 키보드를 숨기기 위해 메모리에서 완전히 언로드하는 것을 거부합니다 ... 어쨌든 나는 여기에 제안 된 수천 가지 솔루션을 결합하여 작동하는 것을 발견했습니다 :)
rupps

27

이 모든 주위 해결책 대신 키보드 를 여는 데 사용 된 (EditText) 필드를 참조하지 않고 어디에서나 소프트 키보드를 닫고 싶지만 필드에 초점이 맞춰져 있으면 여전히 싶었습니다. 이것 (활동에서) :

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

25

이 SO 답변 덕분 에 내 경우에는 ViewPager의 조각을 스크롤 할 때 잘 작동하는 다음을 파생했습니다 ...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

21

위의 답변은 다른 시나리오에서 작동하지만 뷰 내에서 키보드를 숨기고 올바른 컨텍스트를 얻기 위해 고군분투하려면 다음을 시도하십시오.

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

컨텍스트를 생성자에서 가져 오려면 :)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}

18

장치 또는 기능 테스트 중에 소프트 키보드를 닫으려면 테스트에서 "뒤로 단추"를 클릭하여 다음을 수행 할 수 있습니다.

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

위의 내용이 트리거되지 않기 때문에 "뒤로 버튼"을 따옴표로 묶었습니다. onBackPressed() 문제의 활동을 묶었습니다. 키보드를 닫습니다.

뒤로 버튼을 닫는 데 약간의 시간이 걸리므로 잠시 일시 정지 한 후 (예 : 1 초가 충분합니다. ).


16

Android 용 Mono (AKA MonoDroid)에서 수행하는 방법은 다음과 같습니다.

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);

1
무엇 searchbox코드 조각에?
PCoder

16

이것은 모든 기괴한 키보드 동작에 대해 나를 위해 일했습니다.

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

1
이 전에 10 가지 답변을 시도했다고 생각하십시오. 희망을 포기했다. 고마워요
Bolling

mRootView 란 무엇입니까?
justdan0227

14

android:windowSoftInputMode="stateHidden"매니페스트 파일에서 활동 에 추가 하십시오. 예:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

14

간단하고 사용하기 쉬운 메소드, hideKeyboardFrom (YourActivity.this); 키보드를 숨기려면

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

13

활동에이 최적화 된 코드를 사용하십시오.

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

잘 작동합니다. 감사합니다
Alif

12
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

onTouchListener에 대한 호출 후 :

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});

이것도 시도해보십시오-이것은 나를 위해 일했습니다 : InputMethodManager imm = ((InputMethodManager) getSystemService (Activity.INPUT_METHOD_SERVICE)); imm.hideSoftInputFromWindow (getWindow (). getCurrentFocus (). getWindowToken (), 0);
zmicer


12

필자의 경우 작업 표시 줄에서 SearchView를 사용하고있었습니다. 사용자가 검색을 수행하면 키보드가 다시 열립니다.

InputMethodManager를 사용해도 키보드가 닫히지 않았습니다. 초점을 지우고 검색 뷰의 포커스를 false로 설정해야했습니다.

mSearchView.clearFocus();
mSearchView.setFocusable(false);

1
매우 영리한. 사용자가 다른 검색을 원하면 검색을 다시 클릭하십시오.
Alex

SearchView에는 clearFocus()Android API 페이지가 없으므로 작동하지 않지만 다른 해결책이 있습니다 (아래 답변 참조).
Azurespot


12

케이스에 위치 EditText할 수도 AlertDialog있으므로 키보드를 닫을 때 닫아야합니다. 다음 코드는 어디에서나 작동하는 것 같습니다.

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}

1
hideSoftInputFromWindow () 메서드에 매개 변수로 전달할 EditText를 제어 할 필요가 없기 때문에이 솔루션이 더 좋습니다. 잘 작동합니다!
Billyjoker

12

나는이 답변을 거의 모두 시도했지만 특히 삼성 갤럭시 s5와 관련하여 임의의 문제가있었습니다.

내가 끝내는 것은 쇼를 숨기고 완벽하게 작동하는 것입니다.

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.