質問

を持っています EditText そして Button 私のレイアウトでは。

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

役に立ちましたか?

解決

この狂気を解明するために、まずすべての Android ユーザーを代表して、Google によるソフト キーボードに対する全くばかげた扱いについて謝罪したいと思います。同じ単純な質問に対して、それぞれ異なる答えがこれほどたくさんあるのは、Android の他の API と同様に、この API がひどく設計されているためです。丁寧に表現する方法が思いつきません。

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

これが、キーボードを隠すのが非常に難しい理由です。Google 様:ケーキのレシピを調べたら載ってない RecipeProvider 一体、そのケーキを誰が食べるのか、そしてどこで食べるのかを最初に答えないと、レシピを提供することを拒否するでしょう!!

この悲しい物語は醜い真実で終わります。Android キーボードを非表示にするには、2 つの形式の ID を提供する必要があります。ある 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!上記のメソッド呼び出し 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();

他のヒント

Android で強制的に仮想キーボードを非表示にすることができます。 入力メソッドマネージャー, 、呼び出し中 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?.let { it.hideSoftInputFromWindow(v.windowToken, 0) }
 }

また、ソフトキーボードを隠すのに有用である:

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

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

私はキーボードを非表示にするもう一つの解決策を得ます:

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

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

マイヤーのソリューションは、あまりにも私のために動作します。私の場合は私のアプリのトップレベルはtabHostであり、私はタブを切り替える際に、キーワードを非表示にする - 私はtabHostビューからウィンドウトークンを取得

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

onCreate()で、この下のコードを試してみてください。

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

アップデート:なぜこの解決策が機能しなくなったのかわかりません(Android 23でテストしたばかりです)。の解決策を使用してください。 サウラブ・パリーク その代わり。ここにあります:

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

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 リスナーが電話をかける onEditorActionEditTextIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

ドリルダウン

この方法の方が優れており、シンプルで、Android のデザインパターンとより整合していると思います。上記の単純な例では (そして通常、一般的なケースのほとんどで)、次のようになります。 EditText それはフォーカスを持っているか、持っていて、通常は最初にキーボードを呼び出すものでもありました(多くの一般的なシナリオでは間違いなくキーボードを呼び出すことができます)。それと同じように、 それ キーボードを解放するのは、通常、 ImeAction. 。どのようにして EditTextandroid: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);
    }
}

この最後の解決策では、キーボードが一瞬表示され、選択ハンドルが混乱する可能性があります。

キーボードが全画面表示になると、onGlobalLayout は呼び出されません。それを避けるには、次を使用します TextView#setImeOptions(int) または、TextView XML 宣言内で次のようにします。

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

アップデート: キーボードを表示しないために使用するダイアログが見つかり、すべてのバージョンで機能します。

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

私はスレッドに投稿されたすべての解決策に 2 日以上かけて取り組みましたが、何らかの点で不足していることがわかりました。私の正確な要件は、100% の信頼性でオンスクリーン キーボードを表示または非表示にするボタンがあることです。キーボードが非表示状態にある場合、ユーザーがどの入力フィールドをクリックしても、キーボードが再表示されるべきではありません。キーボードが表示状態にあるときは、ユーザーがどのボタンをクリックしてもキーボードが消えてはいけません。これは、Android 2.2 以降から最新のデバイスまですべてで動作する必要があります。

私のアプリでこれの実際の実装を見ることができます クリーンなRPN.

提案された回答の多くをさまざまな携帯電話 (froyo デバイスやジンジャーブレッド デバイスを含む) でテストした結果、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() をオーバーライドしてデバイスのホーム画面に戻ることができます。

あなたがをどこからでもまた、href="https://stackoverflow.com/a/9494042/451962">にこのすべてのソリューションの周りを>キーボードを開くために使用された(のEditText)フィールドへの参照を持たずに、しかし、フィールドが集中していた場合はまだそれをやってみたかった、あなたは(Activityから)これを使用することができます:

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

おかげで、これはSO に答えるhref="https://stackoverflow.com/a/7696791/1617737">

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秒がある、それはバックボタンを閉じるには少し時間がかかるので、先に進む前に、しばらくの間、一時停止することを確認しますので、その後のクリックビューに、など、短い休止後までに登録されることはありません十分な長さIME)。

ここでのAndroid用モノラルで、あなたがそれを行う方法です(AKA MonoDroid)

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

これは、すべての奇妙なキーボードの動作のために私のために働いた。

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

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

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

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

マニフェストファイルでのご活動のandroid:windowSoftInputMode="stateHidden"に追加。例:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

onTouchListenerにその呼び出しの後:

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

この

を使用します
this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

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

InputMethodManagerを使用すると、キーボードを閉じていませんでした。私はclearFocusに持っていたし、falseに検索ビューのフォーカス可能に設定します:

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

ちょうどあなたの活動に、この最適化されたコードを使用します:

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

私は私の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 );
}

私はほとんどこれらの答えの全てを試してみましたが、私は特にサムスンのギャラクシーS5でいくつかのランダムな問題があった。

私はショーを強制されてで終わると隠し、それが完璧に動作何ます:

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

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

いくつかのケースでは、この方法は、他のすべての作品を除くことができます。 これが私の一日を保存します。)

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

public static void hideSoftKeyboard(View view) {
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top