Androidソフトキーボードを閉じる/非表示にする


3819

私が持っているEditTextButton私のレイアウトでは。

編集フィールドに書き込んでをクリックしたButton後、仮想キーボードを非表示にします。これは簡単なコードだと思いますが、その例はどこにありますか?

キーボードの外側に触れたとき。


13
EditTextが1つだけで、チェックボックスやラジオなどのボタンが複数ある場合はどうでしょうか。キーボードが必要な唯一の場所は、単一のEditTextです。キーボードを非表示にするために他の何かが選択/クリックされたことを知るには、どのように登録しますか?
AlikElzin-kilaka

14
私は愚かだ。ICSでキーボードを非表示にできません。ここですべての方法とそれらの組み合わせを試しました。ありえない。それを表示する方法は機能しますが、どのwinwトークン、非表示フラグ、マニフェスト設定、または聖人へのキャンドルであっても、非表示にすることはできません。キーボードショーでは常にこれが表示されます:I / LatinIME(396):InputType.TYPE_NULLが指定されていますW / LatinIME(396):予期しない入力クラス:inputType = 0x00000000 imeOptions = 0x00000000
rupps

4
/ ** *このメソッドは、ソフトキーボードを非表示にするために使用されます。* @param activity * / public void hideSoftKeyboard(Activity activity){InputMethodManager inputMethodManager =(InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus()。getWindowToken()、0); }
Harshal Benake 2014年

これは私にとっては
うまくいっ

デバイスの画面サイズと解像度が増加するにつれて、仮想キーボードを非表示にすることの重要性は低下しています。
Al-Kathiri Khalid 2017

回答:


2038

この狂気を明確にするのを助けるために、私はすべてのAndroidユーザーに代わってGoogleのソフトキーボードのまったくとんでもない扱いについて謝罪することから始めたいと思います。同じ単純な質問に対して、それぞれ異なる多数の回答がある理由は、このAPIがAndroidの他の多くのAPIと同様に恐ろしく設計されているためです。丁寧な言い方は考えられません。

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

これにより、キーボードを非表示にすることが非常に難しくなります。親愛なるグーグル:私がケーキのレシピを探しているとき、RecipeProvider私が最初に誰がケーキを食べるのか、どこで食べるのかと答えない限り、レシピを提供することを拒否する地球上にはありません!

この悲しい話は醜い真実で終わります。Androidキーボードを非表示にするには、a Contextとa Viewまたはaの2つの形式のIDを提供する必要がありますWindow

私はあなたがから呼び出すことを条件に、非常にしっかりと仕事をすることができる静的ユーティリティメソッドを作成しましたActivity

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

このユーティリティメソッドは、Activity!から呼び出された場合にのみ機能することに注意してください。上記のメソッドは、適切なウィンドウトークンをフェッチするgetCurrentFocusためにターゲットActivityを呼び出します。

しかし、EditTextホストされているホストからキーボードを隠したいとしますDialogFragmentか?そのため、上記の方法は使用できません。

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

Fragmentのホストへの参照を渡すため、これは機能しません。ホストが表示されているActivity間、フォーカスは制御されませんFragment。うわー!ですから、フラグメントからキーボードを隠すために、私はより低レベルで、より一般的で醜いものに頼ります:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

以下は、このソリューションの追跡に多くの時間を費やして収集した追加情報です。

windowSoftInputModeについて

もう1つ注意すべき点があります。デフォルトでは、Androidは最初のフォーカスをの最初のEditTextコントロールまたはフォーカス可能なコントロールに自動的に割り当てますActivity。当然ながら、InputMethod(通常はソフトキーボード)はフォーカスイベントに応答して表示されます。のwindowSoftInputMode属性はAndroidManifest.xml、に設定されている場合stateAlwaysHidden、この自動的に割り当てられた初期フォーカスを無視するようにキーボードに指示します。

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

ほとんど信じられないことですが、コントロールに触れたときにキーボードが開かないようにすることは何もないようです(focusable="false"および/またはfocusableInTouchMode="false"コントロールに割り当てられている場合を除く)。どうやら、windowSoftInputMode設定は自動フォーカスイベントにのみ適用され、タッチイベントによってトリガーされるフォーカスイベントには適用されません。

したがって、stateAlwaysHidden実際には非常に不十分な名前です。ignoreInitialFocus代わりに呼び出す必要があります。

お役に立てれば。


更新:ウィンドウトークンを取得するその他の方法

フォーカスされたビューがない場合(フラグメントを変更しただけなど)、便利なウィンドウトークンを提供するビューが他にもあります。

これらは上記のコードの代替ですこれらはif (view == null) view = new View(activity); あなたの活動を明示的に参照していません。

フラグメントクラスの内部:

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

fragmentパラメータとしてフラグメントを指定:

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

コンテンツの本文から始めます。

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

更新2:フォーカスをクリアして、アプリをバックグラウンドで開いたときにキーボードが再び表示されないようにします

メソッドの最後に次の行を追加します。

view.clearFocus();


2
とてもいい記事です。ただし、その上でキーボードをトリガーする別のアクティビティを開始すると、戻ったときにキーボードがまだ存在します。最上位のアクティビティを終了するときにメソッドを使用してキーボードを削除することにより、これを修正しました。
Oyvind

3
@rmirabelleでFragment使用できるようですgetActivity().getWindow().getDecorView()
McX

1
この投稿は素晴らしいですが、2つの非常に重要な部分が不足しています。バージョンごと、製造ごとに行われる微妙な変更。たとえば、Samsungギャラクシーs6では、キーボードを非表示にする前に.clearFocus()を使用する必要があります...そうでない場合は、edittextの2回目のクリックでキーボードがポップアップします:S
Warpzit

17
グーグルは本当にそのKeyboard.hide();ユーティリティを提供するべきです
HendraWD

1
[someView] .getContext()<<アクティビティのケースになる場合があります。常に同じオブジェクトです。(内部サービスを除く...)
Oliver Dixon

4419

あなたは使用して、仮想キーボードを非表示にするアンドロイドを強制することができInputMethodManagerを呼び出して、hideSoftInputFromWindowあなたの集中ビューを含むウィンドウのトークンを渡し、。

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

これにより、すべての状況でキーボードが非表示になります。場合によってはInputMethodManager.HIDE_IMPLICIT_ONLY、2番目のパラメーターとして渡して、ユーザーが明示的にキーボードを強制的に表示しなかった場合(メニューを押したまま)にキーボードを非表示にしたい場合があります。

注: Kotlinでこれを実行する場合は、次を使用します。 context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

Kotlin構文

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

14
おかげで、2番目のパラメーターとして0を使用すると、これはうまく機能するようです。しかし、InputMethodManager.HIDE_IMPLICIT_ONLYを使用すると、キーボードが非表示になることはありません(メニューを押し続けているわけではありません)。ヒントはありますか?
RoflcoptrException

27
涼しい。明確にするために、これは存在する場合にのみそれを閉じますが、ポップアップするのを防ぎませんよね?
Cheezmeister、2011

15
softInputを非表示にする前にeditText.clearFocus()を呼び出すと役立つ場合があります
user2224350

111
editText.clearFocus()その後、呼び出しInputMethodManager.HIDE_IMPLICIT_ONLYも機能します4.1
sprocket12

11
4.4 / htcで私のために働いView focused = getCurrentFocus()たのは、現在フォーカスされているビューを確実に取得するために実行し、を呼び出しfocused.clearFocus()てからinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(フラグをクリアして)でした。
イオノクラストブリガム2015

806

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

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

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


116
マニフェストのアクティビティにandroid:windowSoftInputMode = "stateHidden"を追加することで、同じ効果を実現することもできます。
BoD 2012

7
これをAPIレベル9のフラグメント(所有アクティビティを参照)で試してみましたが、残念ながら機能しませんでした。onResumeとonActivityCreatedで呼び出してみました-影響なし。
AgentKnopf 2013年

2
私はダイアログで作業していますが、これはうまくいきました。Android 3.2を使用しています。onCreateDialog(Bundle)メソッドに入れました。onCreateメソッドでは機能しませんでした。ダイアログダイアログ= super.onCreateDialog(savedInstanceState); dialog.getWindow()。setSoftInputMode(WindowManager.LayoutParams。SOFT_INPUT_STATE_ALWAYS_HIDDEN); その結果、EditTextsを含むビューがキーボードなしで表示されます。ユーザーがエディットテキストに触れると、キーボードが表示されます。
flobacca 2013

4
これは、フォーカスがまだEditTextにある場合(ボタンに触れた後など)は機能しません。Retoのソリューションを使用してください。
Noumenon 2013

4
マニフェストの設定を上書きすることが悪い考えであるのはなぜですか?私はこれを断片から呼んでいます。フラグメントに適用されるマニフェスト設定はありません...
グレッグエニス

349

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

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

ここでは合格HIDE_IMPLICIT_ONLYの位置でshowFlag0の位置にhiddenFlag。ソフトキーボードを強制的に閉じます。


4
showflagsパラメータで非表示フラグを使用しています。これは、定数が同じ整数を使用するためにのみ機能します。正しいフラグの使用例
Alex

私はフォーカスすることができ、複数の編集テキスト、その活動上のボタン、持っているので、私は、このソリューションのように、アンドロイド4.0でテスト

32
@Mark:メソッドは「hideSoftInput」ではなく「toggleSoftInput」と呼ばれるため:)
Sver

19
このソリューションは、キーボードが非表示の場合にキーボードを表示します。それは正しくありません
マイケル・カトコフ

1
@AkashAggarwal-キーボードが表示されていたためにしか機能しなかったという事実を無視すると、「機能します」。(それはキーボードの可視性を切り替えます:それは表示されているときに非表示になりますが、非表示になっているときに表示されます!!)すべての状況で、すべてのデバイスで、Androidの将来のすべてのバージョンで、キーボードが表示されないことを保証できますか?あなたがこれを呼び出すときに表示しますか?その場合は、先に進んで使用してください。
ToolmakerSteve

149

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

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

これをSearchViewでも使用できるようにしました。私の答えは以下を参照してください。ありがとうmckoss!
Azurespot 2014

139

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

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

2
このメソッドは、code.google.com / p / android / issues / detail?id = 7115で説明されているように、2.0および2.1の「ソフトキーボードを非表示にできない」バグを回避する手段として機能します... hideSoftInputFromWindowメソッド上記のリストは試しても機能しませんでしたが、editView.setInputType(0)は機能しました。
スパイクウィリアムズ

18
これはJavadoc(ハックではありません)ごとに合法ですが、メソッドを次のように書き直しますeditView.setInputType(InputType.TYPE_NULL);
Bostone

3
これは機能しますが、android:hintを非表示にします。私はAndroid 1.5を使用しています
Tirtha

これは、ダイアログからキーボードを閉じる必要がある場合に最適です。インスタンスなどを取得する必要はなく、ユーザーがダイアログを閉じるボタンを押すと、これをすべての編集テキストに割り当てることができます
I'm_With_Stupid

機能しますが、カーソルも非表示になります。カーソルは必要ですが、システムキーボードは必要ありません。
Stefan Brendle 2016

129

更新: このソリューションが機能しなくなった理由がわかりません(Android 23でテストしました)。代わりにSaurabh Pareekのソリューションを使用してください。ここにあります:

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

古い答え:

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

8
このコードはどこに配置すればよいですか?getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);を貼り付けようとしました。onCreate()では、キーボードは非表示になりません
user2236096

機能しない、radioGroup.setOnCheckedChangeListener、API 23でテスト済み
ChristianSchäfer

よく見ると、InputMethodManager.HIDE_IMPLICIT_ONLYとInputMethodManager.SHOW_IMPLICITの値は同じで、「1」なので、これらの呼び出しに違いはありません。=>機能していません
Palejandro

imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY、0);を呼び出す場合 次に、キーボードが画面に表示されます:)最良の実装は次のとおりです:github.com/ravindu1024/android-keyboardlistener Shame on Android SDK
Duna

I don't know why this solution is not work any more-Androidであるため、すべてが変更される可能性があります。デザインの一部が不適切である可能性があります...不注意に書き込んだ後、すべてを取り消してすべてを書き換えます。
キングキング

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

5
これは私のために働いた!しかし、なぜinput.setInputType(0)を配置したのですか?そのコード行があると、EditTextViewを操作できませんでした(削除すると機能しました)。
ymerdrengene 2014

たぶんinput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
CoolMind 2018

input.setInputType(0);このコードから削除しました。キーボードの動作とinputTypeを変更しましたEditText
CoolMind 2018年

74

ここにある他のすべての回答が期待どおりに機能しない場合は、キーボードを手動で制御する別の方法があります。

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

+1-閉じたキーボードでアクティビティを開始する場合は、このソリューションを使用して、setEditTextFocus(true)を設定するonclicklistenerを追加します。チャームのような作品!
シュリンゲル2012

コードの2番目のブロックの7行目と10行目に「シンボルコンテキストを解決できません」が表示されました。
gimmegimme 2017

代わりにgetContext()を使用してください
Rotemmiz 2017

61

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

1
これは、最新バージョンで最も効率的です。古いバージョンでは常に調整する必要があります。特にv3以前。
アレックス

2
@Mazen:使用fragment.getActivity().getSystemService();
Johan S

これは、表示と非表示の両方をカバーする最も包括的な答えです。
アンドレ・Staltz

4
いいえ。私のSamsungタブ、Android 5.0では、上記のいわゆる「キーボードを非表示にする」コードでソフトキーボードを切り替えます。すでに非表示になっている場合は、表示されます。この関数の名前にTOGGLEがあるのには理由があります。
ToolmakerSteve、2015年

57

検索してみたところ、ここで私に役立つ答えが見つかりました

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

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

Android 5.1搭載のMotorolaで私のために機能した唯一の製品
GMX

55

短い答え

あなたにはOnClick、リスナーのコールonEditorActionEditTextIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

ドリルダウン

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


この関連する答えを確認してください


これが答えです。バージョン間で機能する唯一の方法。私はこの質問に戻ってこの回答を投稿しました。誰も知らなかったからです
Noah Passalacqua

これが正解です。Androidをだましてキーボードが実際にあるはずの場所に隠すように仕向けるのではなく、ユーザーが完了したことを通知します。これにより、ユーザーがキーボードの[完了]をクリックした場合と同じImeAction [愚かな名前、認めます]がトリガーされます。 。この方法では、ユーザーがキーボードで入力を確認したり、UIボタンをタップしたりしても、違いはありません。
Oliver

46

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

public class KeyBoard {

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

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

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

KeyBoard.toggle(activity);

キーボードが非表示になっている場合でも、「isActive()」がfalseを返し、部分的に機能しました。
xpto 2013年

もちろんそうですが、そうです。または、多分私はあなたを理解していません。とにかく、クラスhide()show()メソッドを補足して、表示するタイミングと表示しないタイミングをより細かく制御できます。私のために働く、私もそれをやった:)私は例を編集します
slinden77

@YoushaAleayoubはい、そうです。 KeyBoard.toggle(fragment.getActivity())
slinden77

@ slinden77、笑、私はあなたの答えについて話している...あなたがコメントしたこれではありません。したがって、その答えはまだ機能しません。
Yousha Aleayoub

@YoushaAleayoubええと、そうです。元の質問ではフラグメントについて言及していません。フラグメントについて言及したのはあなたです。だから私の答えは完全に有効です。フラグメントで使用するにはFragment、コメント付きのように、メソッドをとは異なる方法で呼び出します。メソッドの使い方を学び、戻ってきてください。あなたは愚かな返信で人々を混乱させています
slinden77

43

カスタムキーボードを使用して16進数を入力しているので、IMMキーボードを表示できません...

v3.2.4 setSoftInputShownOnFocus(boolean show)では、天気を制御するため、またはTextViewがフォーカスを取得したときにキーボードを表示しないために、_r1 が追加されましたが、それでも非表示なので、リフレクションを使用する必要があります。

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

ありがとうございました。2つのフラグFLAG_ALT_FOCUSABLE_IMとFLAG_ALT_FOCUSABLE_IMは、実際、私の場合に役立つ唯一のものです。ユーザーがedittextをクリックした場合でも、アクティビティにキーボードを表示したくありませんでした。(私は自分の「キーパッド」を作りました)。
Daniel Novak

クールなソリューションですが、フロントアクティビティがフルスクリーンでない場合、キーボードはその後ろに表示されます。また、キーボードのカーソル移動補助も表示されます。また、スキンの変更はできません。
halxinate 2013年

同感です。考えられるすべての方法のうち、少なくとも標準のAndroid 5.1では、getWindow()。setFlags()メソッドのみが機能します。setSoftInputShownOnFocus()がsetShowSoftInputOnFocus()になり、非表示ではなくなりましたが、少なくともユーザーがフィールドに触れたときは機能しないことに注意してください。
olefevre

あなたの「アップデート」は私にとって唯一の有効な解決策でした。少なくとも2時間は解決策を探しています:)
Stefan Brendle

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

30

私はスレッドに投稿されたすべてのソリューションを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);
    }
}

これにより、現在のアクティビティの状態がバンドルに保存され、その後、アクティビティが開始され、キーボードを表示するか非表示にするかを示すブール値を通過します。

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()をオーバーライドしてデバイスのホーム画面に戻ることができます。


1
手の込んだ回避策ですが、キーボードを非表示にするだけで数千のオブジェクトを再作成するのは多すぎると思います。誰がAndroid用のIMMを設計したかはわかりませんが、Windows APiのようなにおいがします。私の意見では、優れたIMEには2つの方法があるはずです。非表示と表示:-)
2013年

それはすべて本当ですが、私の回避策には1つの利点があります-それは常に機能します!UIのどのフィールドにフォーカスがあるか、ユーザーがどのように切り替えてキーボードを実行したか、および実行しているAndroidのバージョンに関係なく、キーボードを常に切り替える他の解決策はありません:-\
Luke Sleeman

男、私はキーボードを隠すために完全に必死です。何千ものことを試してみましたが、うまくいきませんでした。しかし、あなたの回避策は私には多すぎます。10個のフラグメントのように再作成し、サービスを初期化し、多くのWeakReferencesを削除する必要があります...。GCは25 mbのように捨てるだけです:S ...それでも信頼できる方法を探しています:(
2013年

@Dmitryは、Hello Worldではありません...タブレット用の複雑なアプリケーションです。ばかげたキーボードを隠すためにメモリから完全にアンロードすることを拒否します...とにかく私はここで提案された数千の解決策を組み合わせて動作する何かを見つけました:)
2013年

27

このオールアラウンドソリューションの代わりに、キーボードを開くために使用された(EditText)フィールドを参照せずにどこからでもソフトキーボードを閉じたいが、フィールドがフォーカスされている場合でもそれを実行したい場合は、これ(アクティビティから):

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

25

このSOの回答のおかげで、私は次のように導きました。私の場合、ViewPagerのフラグメントをスクロールするときにうまく機能します...

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

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

21

上記の回答はさまざまなシナリオで機能します、ビュー内でキーボードを非表示にして適切なコンテキストを取得するのに苦労している場合は、これを試してください:

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

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

コンテキストを取得するには、コンストラクタからフェッチします:)

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

18

ユニットテストまたは機能テスト中にソフトキーボードを閉じる場合は、テストの[戻る]ボタンをクリックして終了できます。

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

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

[戻る]ボタンを閉じるには少し時間がかかるため、次に進む前に少し間を置いてください。これにより、ビューなどへの後続のクリックは、少し間を置くまで登録されません(1秒は十分長い時間です) )。


16

Mono for Android(別名MonoDroid)での実行方法は次のとおりです

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

1
searchboxスニペットには何がありますか?
PCoder 2012年

16

これは、すべての奇妙なキーボードの動作に対して私にとってうまくいきました

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

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

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

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

1
私はこれの前に10の答えを試したと思います。希望を捨てた。ありがとう。
ボリング

mRootViewとは何ですか?
justdan0227

14

android:windowSoftInputMode="stateHidden"マニフェストファイルのアクティビティに追加します 。例:

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

14

シンプルで使いやすいメソッド。hideKeyboardFrom(YourActivity.this);を呼び出すだけです。キーボードを隠す

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

13

この最適化されたコードをアクティビティで使用してください:

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

正常に動作します。ありがとう
アリフ

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

その後、onTouchListenerを呼び出します。

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

これも試してください-これは私にとってはうまくいきました:InputMethodManager imm =((InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE)); imm.hideSoftInputFromWindow(getWindow()。getCurrentFocus()。getWindowToken()、0);
zmicer 2013年


12

私の場合、アクションバーのSearchViewを使用していました。ユーザーが検索を実行すると、キーボードが再びポップオープンします。

InputMethodManagerを使用してもキーボードは閉じませんでした。clearFocusを使用して、検索ビューのfocusableをfalseに設定する必要がありました。

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

1
非常に賢い。ユーザーが別の検索を希望する場合は、もう一度[検索]をクリックします。
Alex

SearchViewにはclearFocus()Android APIページにがないため、これは私には機能しませんでしたが、別のソリューションでは機能しました(以下の私の回答を参照)。
Azurespot 2014


12

私もにいる場合EditTextがあるAlertDialogので、キーボードを閉じると閉じます。次のコードはどこでも機能しているようです:

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

1
hideSoftInputFromWindow()メソッドのパラメーターとして渡すEditTextを制御する必要がないため、このソリューションの方が適しています。それはうまくいきます!!
Billyjoker 2015

12

私はこれらすべての答えをほとんど試しましたが、特にsamsung galaxy s5でランダムな問題がいくつかありました。

私が最終的に何をするかは、ショーと非表示を強制することであり、それは完全に機能します:

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

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.