programing

Android 소프트 키보드를 프로그래밍 방식으로 닫거나 숨기는 방법은 무엇입니까?

padding 2023. 6. 2. 20:13
반응형

Android 소프트 키보드를 프로그래밍 방식으로 닫거나 숨기는 방법은 무엇입니까?

나는 있습니다.EditText a 리고a.Button나의 배치에.

▁on▁the▁and후▁writing클한▁after릭▁field▁clicking▁in▁edit▁the를 클릭한 후Button키보드 외부를 터치할 때 가상 키보드를 숨기고 싶습니다.이것은 단순한 코드 조각이라고 생각합니다만, 어디에서 예제를 찾을 수 있습니까?

Android가 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사용자가 메뉴를 누른 채로 키보드를 표시하도록 명시적으로 강제하지 않았을 때만 키보드를 숨길 수 있는 두 번째 매개 변수입니다.

참고: 코틀린에서 이 작업을 수행하려면 다음을 사용합니다.context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

코틀린 구문

// Only runs if there is a view that is currently focused
this.currentFocus?.let { view ->
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
    imm?.hideSoftInputFromWindow(view.windowToken, 0)
}

이 광기를 명확히 하기 위해, 저는 모든 안드로이드 사용자들을 대표하여 구글이 소프트 키보드를 완전히 우스꽝스럽게 취급한 것에 대해 사과하는 것으로 시작하고 싶습니다.동일한 간단한 질문에 대해 각각 다른 많은 답이 있는 이유는 이 API가 Android의 다른 많은 것들과 마찬가지로 끔찍하게 설계되었기 때문입니다.나는 그것을 정중하게 표현할 방법이 없습니다.

키보드를 숨기고 싶습니다.과 같은 문구를 합니다.Keyboard.hide() 정말 감사합니다.하지만 안드로이드는 문제가 있습니다.다음을 사용해야 합니다.InputMethodManager키보드를 숨깁니다.좋아요, 이것은 안드로이드의 키보드 API입니다. 하지만!당신은 필요합니다.ContextIMM에 접근하기 위해.이제 문제가 생겼습니다.하지 않거나 필요 수 .Context더 나쁜에서 무엇을 할 것인지를 입니다.View(혹은 더 나쁜 것은, 무엇입니까?Window키보드를 숨기려는 경우

이것이 키보드를 숨기는 것을 매우 어렵게 만드는 이유입니다.:가 케이크 레시피를 때, 케크레시찾없아니습다보니를피이에게▁no▁is없다▁google습니▁there,▁for니찾▁when보아가 없습니다.RecipeProvider누가 케이크를 먹을 것인지, 어디서 먹을 것인지 내가 먼저 대답하지 않으면 나에게 레시피를 제공하기를 거부할 지구상에서!!

추악한 : , 은 두 신분증을 해야 할 입니다: a 이 슬 이 야 키 드 를 숨 려 기 드 면 두 신 제 합 가 형 야 해 증 을 니 공 분 다 의 태 지 :a.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은 위의방호니다출됩이법라고 합니다.getCurrentFocusActivity올바른 창 토큰을 가져옵니다.

하지만 키보드를 숨기고 싶다고 가정해 보겠습니다.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);
}

다음은 이 솔루션을 찾는 데 더 많은 시간을 허비하여 수집한 몇 가지 추가 정보입니다.

Windows소프트 정보입력 모드

또 다른 논쟁거리가 있습니다.첫 Android에 초기 포커스를 합니다.EditText 가능한 컨트롤을 합니다.Activity입력 방법(일반적으로 소프트 키보드)이 포커스 이벤트에 응답하여 자동으로 표시됩니다.windowSoftInputMode을 입력합니다.AndroidManifest.xml하기로 되어 있을 때stateAlwaysHidden키보드가 자동으로 표시되는 초기 포커스를 무시하도록 지시합니다.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

수 없을 할 때 가 열리는 것을 것은 것도 않는 것처럼 .focusable="false" 및/는focusableInTouchMode="false"컨트롤에 할당됨).보아하니, 창이 소프트합니다.입력 모드 설정은 자동 포커스 이벤트에만 적용되며 터치 이벤트에 의해 트리거된 포커스 이벤트에는 적용되지 않습니다.

그므로러,stateAlwaysHidden이름이 정말 형편없군요.라고 불러야 할 것 같습니다.ignoreInitialFocus대신.


업데이트: 창 토큰을 가져오는 추가 방법

포커스된 보기가 없는 경우(예: 조각을 변경한 경우에만 발생할 수 있음) 유용한 창 토큰을 제공하는 다른 보기가 있습니다.

위 코드에 대한 대안입니다.if (view == null) view = new View(activity);이것들은 당신의 활동을 명시적으로 언급하지 않습니다.

fragment 클래스 내부:

view = getView().getRootView().getWindowToken();

조각이 주어지면fragment매개 변수로:

view = fragment.getView().getRootView().getWindowToken();

컨텐츠 본문부터 시작:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

업데이트 2: 백그라운드에서 앱을 열면 키보드가 다시 표시되지 않도록 포커스를 지웁니다.

메서드의 끝에 다음 행을 추가합니다.

view.clearFocus();

소프트 키보드를 숨기는 데도 유용합니다.

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

사용자가 실제로 편집 텍스트 보기를 누를 때까지 소프트키보드를 누르는 데 사용할 수 있습니다.

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

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

기여패스패스.HIDE_IMPLICIT_ONLY에의 에.showFlag그리고.0에의 에.hiddenFlag소프트 키보드가 강제로 닫힙니다.

마이어의 해결책은 저에게도 효과가 있습니다.제 경우 앱의 최상위 수준은 탭 호스트이며 탭을 전환할 때 키워드를 숨기고 싶습니다. 탭 호스트 보기에서 창 토큰을 가져옵니다.

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(InputType.TYPE_NULL);

업데이트: 이 솔루션이 더 이상 작동하지 않는 이유를 모르겠습니다(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();
    }
}

다음 더 포커스(를 확인합니다.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 ... */
}

그렇게 검색한 결과, 여기서 나는 나에게 맞는 답을 찾았습니다.

// 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청취자 호출onEditorAction의 시대의EditText와 함께IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

드릴다운

저는 이 방법이 안드로이드의 디자인 패턴에 더 좋고, 더 단순하고, 더 잘 어울린다고 생각합니다.위의 간단한 예(그리고 일반적으로 대부분의 일반적인 경우)에서 당신은 다음을 가질 것입니다.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)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);
    }
}

이 마지막 해결 방법은 키보드를 잠시 동안 표시하고 선택 핸들을 잘못 사용할 수 있습니다.

키보드가 전체 화면으로 들어가면 전역 레이아웃이 호출되지 않습니다.이 문제를 방지하려면 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);

11년 만에 공식적으로 지지를 받아 다행입니다.

번째 추가 첫째종성추가implementation 'androidx.core:core-ktx:1.7.0'아첨하다, 아첨하다, 아첨하다, 아첨하다

그런 다음 ViewCompat 또는 WindowCompat 클래스에서 InsetController를 가져옵니다.

마지막으로 InsetsController의 Hide() 및 Show() 기능을 사용합니다.


대화 상자에 대한 지원을 추가합니다.Bottom 가능 SheetDialog에서 할 수 .SheetDialog.@론데브.
컨텍스트에서 직접 캐스트하는 대신 활동을 안전하게 얻을 수 있는 방법을 사용합니다.

import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment

fun View.showKeyboard() = ViewCompat.getWindowInsetsController(this)?.show(WindowInsetsCompat.Type.ime())
fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)?.hide(WindowInsetsCompat.Type.ime())

fun Dialog.showKeyboard() = window?.decorView?.showKeyboard()
fun Dialog.hideKeyboard() = window?.decorView?.hideKeyboard()

fun Context.showKeyboard() = getActivity()?.showKeyboard()
fun Context.hideKeyboard() = getActivity()?.hideKeyboard()

fun Fragment.showKeyboard() = activity?.showKeyboard()
fun Fragment.hideKeyboard() = activity?.hideKeyboard()

fun Activity.showKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.show(WindowInsetsCompat.Type.ime())
fun Activity.hideKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.hide(WindowInsetsCompat.Type.ime())

fun Context.getActivity(): Activity? {
    return when (this) {
        is Activity -> this
        is ContextWrapper -> this.baseContext.getActivity()
        else -> null
    }
}

아래의 이전 답변

여기 github에 대한 간단한 프로젝트가 있습니다.

import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment

fun View.showKeyboard() = ViewCompat.getWindowInsetsController(this)?.show(WindowInsetsCompat.Type.ime())
fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)?.hide(WindowInsetsCompat.Type.ime())

fun Dialog.showKeyboard() = window?.decorView?.showKeyboard()
fun Dialog.hideKeyboard() = window?.decorView?.hideKeyboard()

fun Context.showKeyboard() = getActivity()?.showKeyboard()
fun Context.hideKeyboard() = getActivity()?.hideKeyboard()

fun Fragment.showKeyboard() = activity?.showKeyboard()
fun Fragment.hideKeyboard() = activity?.hideKeyboard()

fun Activity.showKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.show(WindowInsetsCompat.Type.ime())
fun Activity.hideKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.hide(WindowInsetsCompat.Type.ime())

fun Context.getActivity(): Activity? {
    return when (this) {
        is Activity -> this
        is ContextWrapper -> this.baseContext.getActivity()
        else -> null
    }
}
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에서 이 작업 구현을 확인할 수 있습니다.

많은 다른 전화기(프로요 및 진저브레드 장치 포함)에서 제안된 답을 테스트한 후 안드로이드 앱이 안정적으로 다음을 수행할 수 있음이 분명해졌습니다.

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

소프트 키보드가 표시되어야 하는 경우 입력 방법 관리자에 키보드가 표시되고 창에 소프트 입력이 항상 표시되도록 지시됩니다.소프트 키보드를 숨겨야 하는 경우 Windows Manager(윈도우 관리합니다.레이아웃 매개 변수.FLAG_ALT_FOCUSABLE_IM이 설정되어 있습니다.

이 접근 방식은 안드로이드 2.2를 실행하는 4년 된 HTC 전화기부터 4.2.2를 실행하는 넥서스 7에 이르기까지 제가 테스트한 모든 장치에서 안정적으로 작동합니다.이 방법의 유일한 단점은 뒤로 버튼을 조심스럽게 조작해야 한다는 것입니다.내 앱에는 기본적으로 하나의 화면(계산기)만 있으므로 BackPressed()에서 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.

거의 12년이 지난 지금, 우리는 마침내 Android X Core 1.5+로 이를 수행할 공식적이고 역호환적인 방법을 갖게 되었습니다.

fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)
    ?.hide(WindowInsetsCompat.Type.ime())

또는 특히 Fragment에 대해:

fun Fragment.hideKeyboard() = ViewCompat.getWindowInsetsController(requireView())
    ?.hide(WindowInsetsCompat.Type.ime())

키보드를 여는사용된 (EditText) 필드에 대한 참조가 없어도 어디서든 소프트 키보드를 닫고 필드에 초점을 맞춘 경우에는 다음을 사용할 수 있습니다(활동에서).

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

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

위의 답변은 다른 시나리오에서 사용할 수 있지만 보기 안에 키보드를 숨기고 올바른 컨텍스트를 얻으려면 다음을 수행하십시오.

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초 정도면 충분함)에야 등록됩니다.

안드로이드용 모노(일명 모노드로이드)에서 수행하는 방법은 다음과 같습니다.

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

간단하고 사용하기 쉬운 방법, 키보드 숨기기(사용자 활동)를 호출하기만 하면 키보드를 숨깁니다.

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

활동에 이 최적화된 코드를 사용하면 됩니다.

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

android:windowSoftInputMode="stateHidden"매니페스트 파일에 있습니다.예:

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

Kotlin Version경유로Extension Function

코틀린 확장 기능을 사용하면 소프트 키보드를 쉽게 표시하고 숨길 수 있습니다.

확장함수.kt

import android.app.Activity
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.fragment.app.Fragment

fun Activity.hideKeyboard(): Boolean {
    return (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
        .hideSoftInputFromWindow((currentFocus ?: View(this)).windowToken, 0)
}

fun Fragment.hideKeyboard(): Boolean {
    return (context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
        .hideSoftInputFromWindow((activity?.currentFocus ?: View(context)).windowToken, 0)
}

fun EditText.hideKeyboard(): Boolean {
    return (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
        .hideSoftInputFromWindow(windowToken, 0)
}

fun EditText.showKeyboard(): Boolean {
    return (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
        .showSoftInput(this, 0)
}

용도

당신의 제이당에.Activity또는Fragment,hideKeyboard()는 의인스에호출뿐아만수분있액다습니의 만 아니라 할 수 있습니다.EditText 예:

editText.hideKeyboard()

열린 키보드의 경우:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);

키보드 닫기/숨기기:

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 imm.hideSoftInputFromWindow(edtView.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 );
}

언급URL : https://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard-programmatically

반응형