문제

나는 가지고있다 EditText 그리고 Button 내 레이아웃에서.

편집 필드에 작성하고 Button, 가상 키보드를 숨기고 싶어요.나는 이것이 간단한 코드라고 생각합니다. 그러나 이에 대한 예는 어디서 찾을 수 있습니까?

도움이 되었습니까?

해결책

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

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

이것이 키보드를 숨기는 것이 매우 어려운 이유입니다. 친애하는 Google : 케이크를위한 레시피를 찾을 때 RecipeProvider 지구상에서는 케이크가 누구를 먹을지, 어디서 먹을지 먼저 대답하지 않는 한 레시피를 제공하지 않을 것입니다!

이 슬픈 이야기는 못생긴 진실로 끝납니다. 안드로이드 키보드를 숨기려면 두 가지 형태의 식별을 제공해야합니다. Context 그리고 둘 중 하나입니다 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 a 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. 당연히 입력 메드 (일반적으로 소프트 키보드)가 스스로를 표시하여 포커스 이벤트에 응답 할 것입니다. 그만큼 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();

다른 팁

안드로이드를 사용하여 가상 키보드를 숨기도록 강요 할 수 있습니다. 입력 MethodManager, 전화 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

Kotlin Syntax

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

소프트 키보드를 숨기는 데 유용한 것도 다음과 같습니다.

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

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

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

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

여기에 패스 HIDE_IMPLICIT_ONLY 위치에 showFlag 그리고 0 위치에 hiddenFlag. 소프트 키보드를 강제로 닫습니다.

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

아래 코드를 사용해보십시오 onCreate()

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

업데이트:이 솔루션이 왜 더 이상 작동하지 않는지 모르겠습니다 (방금 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);
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

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

일부를 관리하는 함수를 만듭니다. 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);

Saurabh Pareek 지금까지 최고의 대답이 있습니다.

그러나 올바른 깃발을 사용할 수도 있습니다.

/* 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 ... */
}

So Searching에서 여기서 나는 나를 위해 일하는 답을 찾았습니다.

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

짧은 대답

당신의 OnClick 듣는 사람은 전화를 겁니다 onEditorActionEditText ~와 함께 IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

드릴 다운

이 방법이 더 좋고 단순하며 Android의 디자인 패턴과 더 잘 맞습니다. 위의 간단한 예에서 (일반적으로 대부분의 일반적인 경우) EditText 그것은 초점이 있었고 일반적으로 키보드를 처음으로 호출하는 것이 었습니다 (많은 일반적인 시나리오에서는 확실히 호출 할 수 있습니다). 같은 방식으로 그것 키보드를 해제하는 사람이어야합니다. 일반적으로 ImeAction. 방법을보십시오 EditText ~와 함께 android:imeOptions="actionDone" 동작, 동일한 수단으로 동일한 행동을 달성하고 싶습니다.


이것을 확인하십시오 관련 답변

이것은 작동해야합니다 :

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

사용자 정의 키보드를 사용하여 16 진수를 입력하여 IMM 키보드가 표시 될 수 없습니다 ...

v3.2.4_r1에서 setSoftInputShownOnFocus(boolean show) 텍스트 뷰가 초점을 맞출 때는 날씨를 제어하거나 키보드를 표시하지 않기 위해 추가되었지만 여전히 숨겨져 있으므로 반사를 사용해야합니다.

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, a의 도움으로 추가되었습니다 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);
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);
    }
}

나는 스레드에 게시 된 모든 솔루션을 통해 이틀 이상을 보냈으며 어떤 식 으로든 부족한 것을 발견했습니다. 정확한 요구 사항은 100% 신뢰성이 표시되는 버튼이 표시되거나 화면 키보드를 숨기는 것입니다. 키보드가 숨겨진 상태에있는 경우 사용자가 클릭하는 입력 필드에 관계없이 다시 나타나지 않아야합니다. 눈에 보이는 상태에 있으면 사용자가 클릭하는 버튼에 관계없이 키보드가 사라지지 않아야합니다. 이것은 최신 장치까지 Android 2.2+에서 작동해야합니다.

내 앱 에서이 구현을 볼 수 있습니다. 깨끗한 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);
}

소프트 키보드를 표시 해야하는 경우 입력 메트로 드 메너에 키보드를 표시하라는 지시를 받고 창에 소프트 입력을 항상 볼 수 있도록 지시받습니다. 소프트 키보드가 숨겨져 있으면 WindowManager.layoutparams.flag_alt_focusable_im이 설정됩니다.

이 접근법은 내가 테스트 한 모든 장치에서 안정적으로 작동합니다. 이 접근법의 유일한 단점은 뒤로 버튼을 처리해야한다는 것입니다. 내 앱에는 기본적으로 하나의 화면 (계산기) 만 있으므로 OnbackPressed ()를 재정의하고 홈 화면으로 돌아갈 수 있습니다.

대안 적으로 이 모든 것이 해결책입니다, 소프트 키보드를 닫으려면 어디서나 키보드를 여는 데 사용 된 (edittext) 필드에 대한 참조가 없으면 필드가 집중되어 있다면 여전히 수행하고 싶었으며 (활동에서) 사용할 수 있습니다.

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

감사합니다 이렇게 대답합니다, 나는 내 경우에는 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);
    }
}

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

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

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

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

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

뒤로 버튼을 닫는 데 약간의 시간이 걸리므로, 뷰 등으로의 후속 클릭 등이 짧은 후에까지 등록되지 않으므로 (1 초가 충분히 길다. ).

Android 용 Mono에서 수행하는 방법은 다음과 같습니다 (일명 Monodroid)

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

이것은 모든 기괴한 키보드 동작에 대해 저에게 효과적이었습니다.

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

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

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>
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;
    }
});

이것을 사용하십시오

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

제 경우에는 액션 바에서 SearchView를 사용하고있었습니다. 사용자가 검색을 수행하면 키보드가 다시 열려 있습니다.

입력 methodmanager를 사용하면 키보드가 닫히지 않았습니다. 초점을 클리어하고 검색보기의 초점을 false로 설정해야했습니다.

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

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

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

나는 사건이 있습니다 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 );
}

나는이 모든 답을 거의 시도했지만, 특히 삼성 갤럭시 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);
}

경우에 따라이 방법은 다른 모든 것을 제외하고는 작동 할 수 있습니다. 이것은 내 하루를 절약합니다 :)

public static void hideSoftKeyboard(Activity activity) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
            inputManager.hideSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

public static void hideSoftKeyboard(View view) {
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top