android-layout 안드로이드 가상 - Android 소프트 키보드 닫기 / 숨기기




15 Answers

hideSoftInputFromWindow 호출하여 InputMethodManager 사용하여 안드로이드가 가상 키보드를 숨기도록 강요 할 수 있으며 집중 뷰를 포함하는 윈도우의 토큰을 전달할 수 있습니다.

// 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 : context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 사용하십시오.

내리기 이벤트 프래그먼트

레이아웃에 EditTextButton 이 있습니다.

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




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

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

여기에서는 showFlag 의 위치에서 HIDE_IMPLICIT_ONLY 를 전달하고 HIDE_IMPLICIT_ONLY 의 위치에서 0hiddenFlag 합니다. 그것은 부드러운 키보드를 강제로 닫을 것입니다.




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

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



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



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



짧은 대답

OnClick 수신기에서 onEditorAction 을 사용하여 EditTextonEditorAction 을 호출하십시오.

button.setOnClickListener(new OnClickListener() {

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

드릴 다운

이 방법이 Android의 디자인 패턴에 더 좋고, 더 간단하고, 정렬되어 있다고 느낍니다. 위의 간단한 예에서 (일반적으로 대부분의 일반적인 경우) 포커스가있는 / 편집 된 EditText 가 있으며 대개 처음부터 키보드를 호출하는 EditText 가있을 것입니다 (확실히 키보드에서 호출 할 수 있습니다 많은 일반적인 시나리오). 똑같은 방식으로 키보드를 ImeAction 합니다. 일반적으로 ImeAction 으로 수행 할 수 있습니다. android:imeOptions="actionDone" 이있는 EditText 가 어떻게 작동하는지보고, 똑같은 방법으로 같은 행동을하고 싶습니다.

관련 답변 확인




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

v3.2.4_r1에서는 날씨를 제어하거나 TextView에 포커스가있을 때 키보드를 표시하지 않도록 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 사용하여 매우 좋은 결과를 얻었지만 (완벽 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);



스레드에 게시 된 모든 솔루션을 처리하는 데 2 ​​일 이상을 소비했으며 한 가지 방법으로 부족한 것으로 나타났습니다. 내 정확한 요구 사항은 100 % 신뢰도로 화면 키보드를 표시하거나 숨길 수있는 버튼을 갖는 것입니다. 키보드가 숨겨진 상태에있을 때 사용자가 클릭하는 입력 필드에 관계없이 다시 나타나서는 안됩니다. 그것이 보이는 상태에있을 때 키보드는 사용자가 어떤 버튼을 클릭하든 사라지지 않아야합니다. Android 2.2 이상에서 최신 기기까지 작동해야합니다.

내 애플 리케이션 깨끗한 RPN 에서 이것의 작동 구현을 볼 수 있습니다.

다양한 휴대 전화 (froyo 및 진저 브레드 기기 포함)에서 제안 된 답변 중 많은 부분을 테스트 한 결과 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);
    }
}

이렇게하면 현재 액티비티의 상태가 Bundle에 저장되고 액티비티가 시작되어 키보드를 표시할지 또는 숨길지를 나타내는 부울 값을 전달합니다.

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 ()를 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.




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



장치 또는 기능 테스트 중에 소프트 키보드를 닫으려면 테스트에서 "뒤로 단추"를 클릭하십시오.

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

위의 내용 onBackPressed()은 해당 활동에 대한 트리거가 아니므로 "뒤로 버튼"을 따옴표로 묶습니다 . 그냥 키보드를 닫을뿐입니다.

계속 진행하기 전에 잠시 멈추십시오. 뒤로 버튼을 닫는 데 약간의 시간이 걸리므로 짧은 일시 중지 (1 초가 충분할 때까지) 등의 후속 클릭은 등록되지 않습니다 ).




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

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



이것을 사용하십시오.

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



간단하고 사용하기 쉬운 메소드입니다. 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);
}



나는 내 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 );
}





Related