web-dev-qa-db-ja.com

Androidのソフトキーボードを閉じる/隠す

私のレイアウトにはEditTextButtonがあります。

編集欄に書いてButtonをクリックしたら、仮想キーボードを隠したいです。これは単純なコードだと思いますが、その例はどこにありますか。

3341
Vidar Vestnes

この狂気を明確にするために、私はすべてのAndroidユーザーに代わってGoogleのソフトキーボードの実に馬鹿げた扱いを謝罪することから始めたいと思います。このAPIは、Androidの他の多くのAPIと同様に恐ろしく設計されているため、同じ単純な質問に対して非常に多くの回答が存在する理由です。私はそれを述べる丁寧な方法を考えることができません。

キーボードを非表示にします。 Androidに次のステートメントを提供する予定です:Keyboard.hide()。終わり。どうもありがとうございました。ただし、Androidには問題があります。キーボードを非表示にするには、InputMethodManagerを使用する必要があります。いいでしょう、これはキーボードに対するAndroidのAPIです。しかし! IMMにアクセスするには、Contextが必要です。今、問題があります。 Contextを使用または必要としない静的またはユーティリティクラスからキーボードを非表示にすることができます。またはさらに悪いことに、IMMでは、キーボードを非表示にするView(またはさらに悪いことに、Window)を指定する必要があります。

これが、キーボードの非表示を非常に困難にしている理由です。親愛なるGoogle:ケーキのレシピを検索しているとき、地球上にRecipeProviderはありません。ケーキを食べる人と食べる場所に最初に答えない限り、レシピの提供を拒否しません。

この悲しい話はendsい真実で終わります。Androidキーボードを非表示にするには、2つの形式の識別情報を提供する必要があります:ContextViewまたは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);
}

以下は、このソリューションを追うより多くの時間の無駄から収集されたいくつかの追加情報です。

windowSoftInputModeについて

気を付けるべきもう1つの論点があります。デフォルトでは、Androidは、EditTextの最初のActivityまたはフォーカス可能コントロールに初期フォーカスを自動的に割り当てます。当然、InputMethod(通常はソフトキーボード)は、それ自体を表示することでフォーカスイベントに応答します。 AndroidManifest.xmlwindowSoftInputMode属性は、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();

1675
rmirabelle

フォーカスされたビューを含むウィンドウのトークンを渡して、 InputMethodManager を使用して hideSoftInputFromWindow を使用して、Androidに仮想キーボードを非表示にさせることができます。

// 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を2番目のパラメータとして渡します。

注: 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?.let { it.hideSoftInputFromWindow(v.windowToken, 0) }
 }
4268
Reto Meier

ソフトキーボードを隠すのにも便利です。

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

これは、ユーザーが実際にeditTextビューに触れるまでソフトキーボードを抑制するために使用できます。

764
Garnet Ulrich

私はキーボードを隠すためのもう一つの解決策を得ました:

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

ここでは、showFlagの位置にHIDE_IMPLICIT_ONLYを、hiddenFlagの位置に0を渡します。ソフトキーボードを強制的に閉じます。

317
Saurabh Pareek

マイヤーの解決策も私のために働く。私の場合、私のアプリのトップレベルはtabHostで、タブを切り替えるときにキーワードを隠したい - tabHostビューからウィンドウトークンを取得します。

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

以下のコードを試してくださいonCreate()

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

更新: なぜこの解決策がもはやうまくいかないのかわかりません(私は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);
118
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}
74
Sreedev R

ここに挙げた他のすべての答えが期待通りに動作しない場合は、キーボードを手動で制御する別の方法があります。

EditTextのプロパティのいくつかを管理するような関数を作成してください。

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

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

それから、EditTextのonFocusがキーボードを開閉することを確認してください。

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

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

そう検索から、ここで私は私のために働く答えを見つけた

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

短い答え

OnClickリスナーで、IME_ACTION_DONEonEditorActionEditTextを呼び出します

button.setOnClickListener(new OnClickListener() {

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

ドリルダウン

この方法は、Androidの設計パターンにより良く、シンプルで、より整合していると感じています。上記の簡単な例(そして通常はほとんどの場合)では、EditTextにフォーカスがある/持っていて、通常最初にキーボードを呼び出すものでもあります(間違いなく可能です)多くの一般的なシナリオで呼び出します)。同じように、itはキーボードをリリースするものでなければならず、通常はImeActionで実行できます。 Android:imeOptions="actionDone"を含むEditTextの動作を確認するだけで、同じ手段で同じ動作を実現できます。


これを確認してください 関連する回答

49
Alex.F

これはうまくいくはずです。

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

カスタムキーボードを使用して16進数を入力しているため、IMMキーボードが表示されません。

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の助けを借りて追加された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);
39
sergio91pt
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);
    }
}
29
shobhan

スレッドに掲載されているすべてのソリューションを2日間以上かけて作業したところ、何らかの形で不足していることがわかりました。私の正確な要件は、100%の信頼性で画面上のキーボードを表示または非表示にするボタンを持つことです。キーボードが非表示状態になっているときは、ユーザーがどの入力フィールドをクリックしても、表示されません。表示状態のときは、ユーザーがどのボタンをクリックしてもキーボードは消えません。これは、Android 2.2以降で最新のデバイスまで動作する必要があります。

あなたは私のアプリでこれの実用的な実装を見ることができます クリーンRPN

提案された回答の多くをさまざまな携帯電話(froyoやGingerbreadデバイスを含む)でテストした結果、Androidアプリは確実に次のことができることが明らかになりました。

  1. キーボードを一時的に隠します。ユーザーが新しいテキストフィールドにフォーカスすると再び表示されます。
  2. アクティビティの開始時にキーボードを表示し、アクティビティにフラグを設定して、キーボードが常に表示されるようにする必要があることを示します。このフラグは、アクティビティが初期化中の場合にのみ設定できます。
  3. 絶対にキーボードの使用を許可または禁止するようにアクティビティをマークします。このフラグは、アクティビティが初期化中の場合にのみ設定できます。

私にとっては、キーボードを一時的に隠すだけでは不十分です。一部のデバイスでは、新しいテキストフィールドがフォーカスされるとすぐに再表示されます。私のアプリは1ページに複数のテキストフィールドを使用しているため、新しいテキストフィールドにフォーカスを合わせると、隠されたキーボードが再びポップアップ表示されます。

残念ながら、リストの項目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を設定します。

このアプローチは私がテストしたすべてのデバイスで確実に動作します - Android 2.2を実行している4歳のHTC電話から4.2.2を実行しているnexus 7まで。この方法の唯一の欠点は、戻るボタンの取り扱いに注意する必要があることです。私のアプリは基本的に1つの画面(それは計算機)しか持っていないので、onBackPressed()をオーバーライドしてデバイスのホーム画面に戻ることができます。

25
Luke Sleeman

キーボードを開くのに使用されていた(EditText)フィールドを参照せずにソフトキーボードどこからでもを閉じたいが、それでもやりたい場合は、 this all around solution の代わりに_ /フィールドがフォーカスされている場合は、(Activityから)これを使用できます。

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

this SO answer のおかげで、私は次のものを導き出しました。私の場合は、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
Ash

ユニットテストまたは機能テスト中にソフトキーボードを閉じたい場合は、テストの「戻る」ボタンをクリックしてください。

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

上記の例では、問題のアクティビティのonBackPressed()がトリガーされないため、「戻るボタン」を引用符で囲みます。キーボードを閉じるだけです。

戻るボタンを閉じるには少し時間がかかるので、次に進む前にクリックするなどしてしばらくすると登録されません(1秒で十分です) ).

17
Peter Ajtai

これは、Mono for Android(AKA MonoDroid)で行う方法です

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

マニフェストファイルのAndroid:windowSoftInputMode="stateHidden"をあなたのアクティビティに追加してください。例:

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

これは私にとって奇妙なキーボードの振る舞いのすべてに役立ちました

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);
    }
}
13
Asaf Pinhassi

私の場合は、アクションバーにSearchViewを使用していました。ユーザーが検索を実行した後、キーボードが再び開きます。

InputMethodManagerを使用してもキーボードが閉じませんでした。私はclearFocusし、検索ビューのフォーカス可能をfalseに設定しなければなりませんでした:

mSearchView.clearFocus();
mSearchView.setFocusable(false);
11
tommy chheng

私はほとんどすべての答えを試してみました、私は特にサムスン銀河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);
}
11
ahmed_khan_89

場合によっては、このメソッドは他のすべてのメソッドを除いて機能します。 これは私の日を救う:)

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

シンプルで使いやすいメソッドです。 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);
}
11
Naveed Ahmad

これを使って

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
11
Atish Agrawal

私はEditTextAlertDialog内にも置くことができる場合があるので、キーボードは閉じて閉じるべきです。次のコードはどこでも動作しているようです。

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 );
}
10
injecteer
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;
    }
});
10
Riser

あなたの活動にこの最適化されたコードを使うだけです:

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

毎回魔法のような働きをする

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}

private void openKeyboard() {
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }
}
8

オープンキーボードの場合:

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);
8
Girish Patel

EditTextで setImeOption を使うことも検討できます。

私のレイアウトにEditTextと検索ボタンが含まれているという非常に似たような状況がありました。私のeditTextでimeオプションを "actionSearch"に設定できることを発見したとき、私はもう検索ボタンさえ必要としないことに気づきました。 (このモードの)ソフトキーボードには検索アイコンがあり、これを使って検索を開始することができます(そして期待通りにキーボードが閉じます)。 

8
jasonhudgins

時々あなたが望むのはあなたが属性を持っているkeyboardボックスを与えるEditText を折り込むためのエンターボタンだけです 

 Android:imeOptions="actionDone" 

これにより、EnterボタンがDoneボタンに変わり、キーボードが閉じます。

7
user1765048

わたしにはできる..

EditText editText=(EditText)findViewById(R.id.edittext1);

onClick()のコード行の下に配置

editText.setFocusable(false);
editText.setFocusableInTouchMode(true);

ここでButtonをクリックしたときにキーボードを隠し、EditTextキーボードに触れると表示されます。

(OR)

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

場合によっては、editTextを含む行を含むリストビューを含むアクティビティがある可能性があるので、マニフェストSOFT_INPUT_ADJUST_PANで設定する必要があります。そうすると、それらのキーボードには迷惑なものが表示されます。

次の回避策は、onCreateの末尾に配置すると機能します。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            }
        },100);
6
Ricardo

これを試して

  • あなたはあなたのActivityを呼び出すことができます簡単 

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

  • MainActivitiyでこれを呼び出します 

 hideKeyboardwithoutPopulate(MainActivity.this);

6
Vishal Yadav

AndroidManifest.xmlの下の<activity..>Android:windowSoftInputMode="stateAlwaysHidden"を設定します

5
milad.moafi

Javaコードを使ってキーボードを隠したい場合は、次のようにします。

  InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
  imm.hideSoftInputFromWindow(fEmail.getWindowToken(), 0);

キーボードを常に隠したい場合は、AndroidManifestでこれを使用します。

 <activity
 Android:name=".activities.MyActivity"
 Android:configChanges="keyboardHidden"  />
5
pavel

もし興味があるなら、私はKotlinのために小さなエクステンションを書きました。

fun Fragment.hideKeyboard(context: Context = App.instance) {
    val windowToken = view?.rootView?.windowToken
    windowToken?.let {
        val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(windowToken, 0)
    }
}

App.instanceは、Applicationに格納されている静的な "this"アプリケーションオブジェクトです。

更新:場合によっては、windowTokenがnullになります。キーボードが閉じているかどうかを検出するためにリフレクションを使ってキーボードを閉じる方法を追加しました。

/**
 * If no window token is found, keyboard is checked using reflection to know if keyboard visibility toggle is needed
 *
 * @param useReflection - whether to use reflection in case of no window token or not
 */
fun Fragment.hideKeyboard(context: Context = MainApp.instance, useReflection: Boolean = true) {
    val windowToken = view?.rootView?.windowToken
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    windowToken?.let {
        imm.hideSoftInputFromWindow(windowToken, 0)
    } ?: run {
        if (useReflection) {
            try {
                if (getKeyboardHeight(imm) > 0) {
                    imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
                }
            } catch (exception: Exception) {
                Timber.e(exception)
            }
        }
    }
}

fun getKeyboardHeight(imm: InputMethodManager): Int = InputMethodManager::class.Java.getMethod("getInputMethodWindowVisibleHeight").invoke(imm) as Int
5
Janusz Hain
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
5

これは働いています..

現在のアクティビティインスタンスを関数に渡すだけです 

 public void isKeyBoardShow(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    if (imm.isActive()) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    } else {
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }
}
5
dev_mg99

実際には、Android権限は常に新しい更新を与えていますが、すべてのAndroid開発者が開発時に直面していた古い欠点を処理していません。しかし、残念ながら、彼らは管理していません。はい、それを残します。

以下は、ActivityまたはFragmentでキーボードオプションを表示/非表示/切り替えするための解決策です。

ビューのキーボードを表示します。

/**
 * open soft keyboard.
 *
 * @param context
 * @param view
 */
public static void showKeyBoard(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.showSoftInput(view, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

アクティビティのコンテキストでキーボードを表示する:

/**
 * open soft keyboard.
 *
 * @param mActivity context
 */
public static void showKeyBoard(Activity mActivity) {
    try {
        View view = mActivity.getCurrentFocus();
        if (view != null) {
            InputMethodManager keyboard = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

フラグメントコンテキストでキーボードを表示する:

/**
 * open soft keyboard.
 *
 * @param mFragment context
 */
public static void showKeyBoard(Fragment mFragment) {
    try {
        if (mFragment == null || mFragment.getActivity() == null) {
            return;
        }
        View view = mFragment.getActivity().getCurrentFocus();
        if (view != null) {
            InputMethodManager keyboard = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

ビューのキーボードを隠す:

/**
 * close soft keyboard.
 *
 * @param context
 * @param view
 */
public static void hideKeyBoard(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

アクティビティのコンテキストでキーボードを隠す:

/**
 * close opened soft keyboard.
 *
 * @param mActivity context
 */
public static void hideSoftKeyboard(Activity mActivity) {
    try {
        View view = mActivity.getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

フラグメントコンテキストでキーボードを隠す:

/**
 * close opened soft keyboard.
 *
 * @param mFragment context
 */
public static void hideSoftKeyboard(Fragment mFragment) {
    try {
        if (mFragment == null || mFragment.getActivity() == null) {
            return;
        }
        View view = mFragment.getActivity().getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

キーボードの切り替え:

/**
 * toggle soft keyboard.
 *
 * @param context
 */
public static void toggleSoftKeyboard(Context context) {
    try {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4
Ready Android

単にコード: onCreate()でこのコードを使用してください

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

これはhideとshowの両方の方法です。

コトリン

fun hideKeyboard(activity: Activity) {
    val v = activity.currentFocus
    val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(v != null)
    imm.hideSoftInputFromWindow(v!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val v = activity.currentFocus
    val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(v != null)
    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View v = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert imm != null && v != null;
    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View v = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert imm != null && v != null;
    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
}
3
Khemraj

あなたがあなたのアプリケーションを開発するためにKotlinを使うならば、それは本当にするのが簡単です。

この拡張機能を追加します。

活動のために:

fun Activity.hideKeyboard() {
    val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    val view = currentFocus
    if (view != null) {
        inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

フラグメントの場合:

fun Fragment.hideKeyboard() {
    activity?.let {
        val inputManager = it.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val view = it.currentFocus
        if (view != null) {
            inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }
}

これで、あなたはあなたのFragmentまたはActivityで簡単に呼ぶことができます:

 hideKeyboard()
3
Krasavello13
final RelativeLayout llLogin = (RelativeLayout) findViewById(R.id.rl_main);
        llLogin.setOnTouchListener(
                new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent ev) {
                        InputMethodManager imm = (InputMethodManager) this.getSystemService(
                                Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
                        return false;
                    }
                });
3
Mr.vicky

これを試してください

public void disableSoftKeyboard(final EditText v) {
    if (Build.VERSION.SDK_INT >= 11) {
        v.setRawInputType(InputType.TYPE_CLASS_TEXT);
        v.setTextIsSelectable(true);
    } else {
        v.setRawInputType(InputType.TYPE_NULL);
        v.setFocusable(true);
    }
}
3
Sagar Badave

とても簡単な方法

私はすべてのプロジェクトでこれを行い、夢のように働きます。あなたの宣言にlayout.xmlはこの一行を追加するだけです:

Android:focusableInTouchMode="true"

完全なコード例:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:focusableInTouchMode="true">

    <EditText
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <ListView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </ListView>

</Android.support.constraint.ConstraintLayout>
3
Daniel Beltrami

これが最善の解決策です。

解決策1)inputTypeを“ text”に設定します

<EditText
Android:id="@+id/my_edit_text"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:hint="Tap here to type"
Android:inputType="text" />

これはプログラムによっても可能です。メソッドsetInputType()(TextViewから継承) 

EditText editText = (EditText) findViewById(R.id.my_edit_text);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT | 
InputType.TYPE_TEXT_VARIATION_NORMAL);

解決策2)InputMethodManager.hideSoftInputFromWindow()を使用してください。

InputMethodManager imm = 
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

または

InputMethodManager imm = (InputMethodManager) 
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 
InputMethodManager.HIDE_NOT_ALWAYS);

簡単な方法みんな:これを試してください...

private void closeKeyboard(boolean b) {

        View view = this.getCurrentFocus();

        if(b) {
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
        }
        else {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, 0);
        }
    }
3
Joolah
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity
            .getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus()
            .getWindowToken(), 0);
}
3

簡単な回避策は、ボタンeditText.setEnabled(false);editText.setEnabled(true);メソッドでonClick()することです。

2
KarlTheGreat

ボタンをクリックしたときに手動でキーボードを隠したい場合:

/**
 * Hides the already popped up keyboard from the screen.
 *
 */
public void hideKeyboard() {
    try {
        // use application level context to avoid unnecessary leaks.
        InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        assert inputManager != null;
        inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

edittext以外のときに画面のどこをクリックしてもキーボードを非表示にしたい場合 あなたの活動の中でこのメソッドをオーバーライドしてください:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View view = getCurrentFocus();
    if (view != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("Android.webkit.")) {
        int scrcoords[] = new int[2];
        view.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + view.getLeft() - scrcoords[0];
        float y = ev.getRawY() + view.getTop() - scrcoords[1];
        if (x < view.getLeft() || x > view.getRight() || y < view.getTop() || y > view.getBottom())
            ((InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow((this.getWindow().getDecorView().getApplicationWindowToken()), 0);
    }
    return super.dispatchTouchEvent(ev);
}
2
Rishabh Saxena

Androidでは、InputMethodManageによってVキーボードを非表示にするために、フォーカスされたビューを含むウィンドウのトークンを渡すことによってhideSoftInputFromWindowを呼び出すことができます。

View view = this.getCurrentFocus();
if (view != null) {  
InputMethodManager im = 
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

EditText.clearFocus()を呼び出してからInputMethodManager.HIDE_IMPLICIT_ONLYを呼び出すことでも機能する 

2
Nadeem Bhat

ソフトキーボードを隠したい場所にこのコードを追加するだけです。」

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

コトリンで

fun hideKeyboard(activity: BaseActivity) {
        val view = activity.currentFocus?: View(activity)
        val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
2
Qamar

部分的にxmlから、部分的にカスタムレイアウトエンジンからレイアウトを作成しました。これらはすべてコード内で処理されます。私にとってうまくいった唯一のことは、キーボードが開いていたかどうかを追跡し、次のようにキーボードの切り替え方法を使用することでした。

public class MyActivity extends Activity
{
    /** This maintains true if the keyboard is open. Otherwise, it is false. */
    private boolean isKeyboardOpen = false;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        LayoutInflater inflater;
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View contentView = inflater.inflate(context.getResources().getIdentifier("main", "layout", getPackageName()), null);

        setContentView(contentView);
        contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
        {
            public void onGlobalLayout() 
            {
                Rect r = new Rect();
                contentView.getWindowVisibleDisplayFrame(r);
                int heightDiff = contentView.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) 
                    isKeyboardVisible = true;
                else
                    isKeyboardVisible = false;
             });
         }
    }

    public void closeKeyboardIfOpen()
    {
        InputMethodManager imm;
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (isKeyboardVisible)
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    }   
}
2
Phil

この方法は常にどんな犠牲を払ってもうまくいくでしょう。キーボードを隠したいところならどこでも使えます

public static void hideSoftKeyboard(Context mContext,EditText username){
        if(((Activity) mContext).getCurrentFocus()!=null && ((Activity) mContext).getCurrentFocus() instanceof EditText){
            InputMethodManager imm = (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(username.getWindowToken(), 0);
        }
    }

このように使用してください。

Androidのバージョンは何ですか。この方法はきっとうまくいくでしょう

2
Gaurav Arora

これは私のために働きました。

public static void hideKeyboard(Activity act, EditText et){
    Context c = act.getBaseContext();
    View v = et.findFocus();
    if(v == null)
        return;
    InputMethodManager inputManager = (InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
2
moberme

すべての方法を組み合わせて、必死でここですべて試してみました、そしてもちろんキーボードはアンドロイド4.0.3(それはハニカムAFAIRで動作しました)で閉じません。

それから突然、私は明らかに勝つ組み合わせを見つけました:

textField.setRawInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_NORMAL);

あなたのいつものレシピと組み合わせる

blahblaj.hideSoftInputFromWindow ...

これが誰かが自殺するのを止めることを願っています..私はそれに近かった。もちろん、それが機能する理由はわかりません。

1
rupps

SearchViewを使用する別の方法はこのコードを使用することです。

searchView = (SearchView) searchItem.getActionView();    
searchView.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        InputMethodManager imm = (InputMethodManager)
        getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(searchView.getApplicationWindowToken(), 0);
    }
}

これはActionBarのSearchView検索ボックスで、クエリからのテキストが送信されると(ユーザーがEnterキーまたは検索ボタン/アイコンを押す)、InputMethodManagerコードがアクティブになり、ソフトキーボードが下がります。このコードは私のonCreateOptionsMenu()に入れられました。 searchItemは、onCreateOptionsmenu()のデフォルトコードの一部であるMenuItemからのものです。このコードをたくさん寄せてくれた@mckossに感謝します。

1
Azurespot

あなたは Extension どんなビューに対してもfunctionを作成することができます

fun View.hideKeyboard() = this.let {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

アクティビティでの使用例

window.decorView.hideKeyboard();

Viewの使用例

etUsername.hideKeyboard();

ハッピーコーディング...

ソフトキーボードを隠すにはこのメソッドを呼び出します。

public void hideKeyBoard() {
    View view1 = this.getCurrentFocus();
    if(view!= null){
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view1.getWindowToken(), 0);
    }
}
1
Rajneesh Shukla
public static void closeInput(final View caller) {  
    caller.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }, 100);
}

このメソッドは一般的に機能しますが、1つ条件があります。Android:windowSoftInputMode="any_of_these"を設定することはできません。

1
Jacek Kwiecień

これらすべての答えにもかかわらず、十分に単純にするために、私はこれを行うための共通の方法を書きました。

/**
 * hide soft keyboard in a activity
 * @param activity
 */
public static void hideKeyboard (Activity activity){
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    if (activity.getCurrentFocus() != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }
}
1
Geng Jiawen

上記のすべての回答と別の投稿を読んだ後、キーボードを自動的に開くことができませんでした。

私のプロジェクトでは、ダイアログ(AlertDialog)を動的に作成しました(必要な最小限のXMLを使用して、または使用せずにプログラミングすることにより)。

だから私は次のようなことをしていました:

    dialogBuilder = new AlertDialog.Builder(activity);

    if(dialogBuilder==null)
        return false; //error

    inflater      = activity.getLayoutInflater();
    dialogView    = inflater.inflate(layout, null);
    ...

そして、すべてのビュー(TextView、ImageView、EditTextなど)のセットアップを完了した後、次のことを行いました。

        alertDialog = dialogBuilder.create();

        alertDialog.show();

すべての答えで遊んだ後、それらのほとんどが動作することがわかりましたIFご存知ここで、はリクエストを入れるために...そしてそれがすべての鍵でした。

だから、トリックはそれを置くことですの前にダイアログの作成:私の場合、alertDialog.show()、これは魅力のように機能しました:

        alertDialog = dialogBuilder.create();           
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        //And only when everything is finished - let's bring up the window - 
        alertDialog.show();

        //Viola... keyboard is waiting for you open and ready...
        //Just don't forget to request focus for the needed view (i.e. EditText..)

この原則はすべてのウィンドウで同じであると確信しているため、「showKeyboard」コードの場所に注意してください。ウィンドウが起動する前でなければなりません。

Android SDK開発チームからの小さなリクエスト:

世界中の何千人ものプログラマーがこのばかげた些細な問題を扱っているのを見ることができるので、これはすべて不要だと思いますが、その解決策はきれいでシンプルでなければなりません:入力指向のビューにrequestFocus()を取得する場合EditTextとして)、ユーザーがそうしないように要求しない限り、キーボードが自動的に開くので、requestFocus()メソッドがここのキーであり、trueのデフォルト値を持つboolean showSoftKeyboardを受け入れるべきだと思います:View.requestFocus(boolean showSoftKeyboard);

これが私のような人に役立つことを願っています。

1
JamesC

以下のコードは、どこからでも呼び出せる汎用関数を作るのに役立ちます。 

import Android.app.Activity
import Android.content.Context
import Android.support.design.widget.Snackbar
import Android.view.View
import Android.view.inputmethod.InputMethodManager

public class KeyboardHider {
    companion object {

        fun hideKeyboard(view: View, context: Context) {
            val inputMethodManager = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
            inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
        }

    }

}

1行のコードを使用して、どこからでもAboveメソッドを呼び出します。

CustomSnackbar.hideKeyboard(view, this@ActivityName)

viewは、アクティビティのルートレイアウトなど何でも構いません。

1
Arihant Jain

やあこんにちはこれはあなたがあなたの活動が例えばonCreate()でそれがロードされるときあなたの活動の最初にあまりにも早くコードをJavaに変換することができると信じて私があなたが活動をロードするとき簡単である。

fun hideKeybord (){
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (inputManager.isAcceptingText){
    inputManager.hideSoftInputFromWindow(currentFocus.windowToken, 0)
}

}

私があなたのonCreate()メソードでこの関数を呼び出した後、manafest.xmlファイルのあなたのアクティビティにこのAndroid:windowSoftInputMode="stateAlwaysHidden"行を追加します。 

<activity
    Android:name=".Activity.MainActivity"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme.NoActionBar"
    Android:windowSoftInputMode="stateAlwaysHidden">
0
hardiBSalih

そこにいるkotlinユーザーのためにここに私のユースケースのために働いたkotlin拡張方法があります:

fun View.hideKeyboard() {
    val imm = this.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

それをViewExtensions(またはあなたが持っているもの)と呼ばれるファイルに入れて、通常の方法のようにあなたのビューでそれを呼び出します。

0
shrewdu

アプリケーションが APIレベル21以上をターゲットにしている場合 使用するデフォルトの方法があります

editTextObj.setShowSoftInputOnFocus(false);

EditText XMLタグに以下のコードを設定したことを確認してください。

<EditText  
    ....
    Android:enabled="true"
    Android:focusable="true" />
0
Harpreet

これは私の仕事でした。キーボードを隠すためにKotlinにあります。

private fun hideKeyboard() {
        val inputManager = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val focusedView = activity?.currentFocus
        if (focusedView != null) {
            inputManager.hideSoftInputFromWindow(focusedView.windowToken,
                    InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }
0

このコードスニペットは役に立ちます。

    final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null && inputMethodManager.isActive()) {
        if (getCurrentFocus() != null) {
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }

必要に応じてさまざまなメソッドで呼び出すことができます(onPause、onResume、onRestartなど)。

0
Selman Tosun

私は以下のKotlin Activity拡張機能を使っています:

/**
 * Hides soft keyboard if is open.
 */
fun Activity.hideKeyboard() {
    currentFocus?.windowToken?.let {
        (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
                ?.hideSoftInputFromWindow(it, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

/**
 * Shows soft keyboard and request focus to given view.
 */
fun Activity.showKeyboard(view: View) {
    view.requestFocus()
    currentFocus?.windowToken?.let {
        (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
                ?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}
0
jBegera

アプリケーション起動時にキーボードを表示するには

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        view.requestFocus();
        new Handler().postDelayed(new Runnable() {
            public void run() {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            }
        }, 1000);
0
Dmitry

まず、次のようにXMLファイルからAndroid:imeOptionsフィールドを追加し、その値をactionUnspecified | actionGoに追加する必要があります

 <Android.support.design.widget.TextInputEditText
                    Android:id="@+id/edit_text_id"
                    Android:layout_width="fill_parent"
                    Android:layout_height="@dimen/edit_text_height"
                    Android:imeOptions="actionUnspecified|actionGo"
                    />

次に、JavaクラスにsetOnEditorActionListenerを追加し、以下のようにInputMethodManagerを追加します

enterOrderNumber.setOnEditorActionListener(new TextView.OnEditorActionListener(){

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_GO) {
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
            return true;
        }
        return false;
    }
});
0

コトリン版 

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

try catchで囲むと、キーボードはすでに閉じられているので、アプリはクラッシュしません。 

try{

View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}catch (Exception e)
{
  e.printStackTrace();
}
0
Heena Arora

私はすべての解決策を非常に試してみましたが、解決策が私のために働かないので、私は私の解決策を見つけました:あなたは次のようなブール変数を持つべきです:

public static isKeyboardShowing = false;
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

そして、タッチスクリーンのイベントではあなたが呼ぶ:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(keyboardShowing==true){
        inputMethodManager.toggleSoftInput(InputMethodManager.RESULT_UNCHANGED_HIDDEN, 0);
        keyboardShowing = false;
    }
    return super.onTouchEvent(event);
}

そしてEditTextではどこにでもあります:

yourEditText.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            yourClass.keyboardShowing = true;

        }
    });
0
nobjta_9x_tq

Xamarin.Androidの場合:

public void HideKeyboard()
{
    var imm = activity.GetSystemService(Context.InputMethodService).JavaCast<InputMethodManager>();
    var view = activity.CurrentFocus ?? new View(activity);
    imm.HideSoftInputFromWindow(view.WindowToken, HideSoftInputFlags.None);
}
0
mr5

特定のアクティビティでAndroidManifestに次の行を追加するだけです。

<activity
        Android:name=".MainActivity"
        Android:screenOrientation="portrait">
        Android:windowSoftInputMode="adjustPan"/>
0
Bhavik Nathani

マニフェストアクティビティタグの内側に1行だけ書く

 Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

そしてそれはうまくいくでしょう。

0
Mansuu....
 fun hideKeyboard(appCompatActivity: AppCompatActivity) {
        val view = appCompatActivity.currentFocus
        val imm = appCompatActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
0
Umesh Maharjan

baseActivityとBaseFragmentでアプリケーション全体に共通のメソッドを作成するだけです

onCreate()でinitialize inputMethodManager

inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

キーボードの表示/非表示を切り替える

public void hideKeyBoard(View view) {
     if (view != null) {
         inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
      }
 }

public void showKeyboard(View view, boolean isForceToShow) {
      if (isForceToShow)
         inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
      else if (view != null)
           inputMethodManager.showSoftInput(view, 0);
}
0
Priyankagb
use Text watcher instead of EditText.and after you finished entering the input 

あなたが使用することができます 

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
0
koteswara D K
there are two ways to do so...

method 1:in manifest file

define the line **Android:windowSoftInputMode="adjustPan|stateAlwaysHidden"** of code in your manifest.xml file as below...

<activity
            Android:name="packagename.youactivityname"
            Android:screenOrientation="portrait"
            Android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />

Method 2 : in Activity or Java class

 if(getCurrentFocus()!=null) {
            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)`enter code here`;
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }

それは動作します.... @ ASK

/** 
 *
 *   Hide I Said!!!
 *
 */
public static boolean hideSoftKeyboard(@NonNull Activity activity) {
    View currentFocus = activity.getCurrentFocus();
    if (currentFocus == null) {
        currentFocus = activity.getWindow().getDecorView();
        if (currentFocus != null) {
            return getSoftInput(activity).hideSoftInputFromWindow(currentFocus.getWindowToken(), 0, null);
        }
    }
    return false;
}

public static boolean hideSoftKeyboard(@NonNull Context context) {
   if(Activity.class.isAssignableFrom(context.getClass())){
       return hideSoftKeyboard((Activity)context);
   }
   return false;
}

public static InputMethodManager getSoftInput(@NonNull Context context) {
    return (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
}
0
ceph3us

いくつかのコトリンコード: 

アクティビティからキーボードを隠す:

(currentFocus ?: View(this))
            .apply { (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
                        .hideSoftInputFromWindow(windowToken, 0) }
0
Rafols

KotlinでのWikiの回答:

1 - ファイル内に 最上位関数 を作成します(たとえば、すべての最上位関数を含むファイル)。

fun Activity.hideKeyboard(){
    val imm = this.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    var view = currentFocus
    if (view == null) { view = View(this) }
    imm.hideSoftInputFromWindow(view.windowToken, 0)
}

2 - それからそれをあなたがそれを必要としたどんな活動でもそれを呼びます:

this.hideKeyboard()
0
Phil
public void hideKeyboard() 
{
    if(getCurrentFocus()!=null) 
    {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}


public void showKeyboard(View mView) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    mView.requestFocus();
    inputMethodManager.showSoftInput(mView, 0);
}
0
Coldfin Lab
private void hideSoftKeyboard() {
    View view = getView();
    if (view != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
                .getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}
0
Duna

コトリンでこれを試してください

 private fun hideKeyboard(){
    val imm = activity!!.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(activity!!.currentFocus!!.windowToken, 0)
}

Javaでこれを試す

 private void hideKeyboard(){
  InputMethodManager imm =(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
0
bala