4169

EditTextレイアウトにとがありButtonます。

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

4

123 に答える 123

4601

InputMethodManagerを使用して、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構文

// Only runs if there is a view that is currently focused
this.currentFocus?.let { view ->
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
    imm?.hideSoftInputFromWindow(view.windowToken, 0)
}
于 2009-07-10T11:52:00.487 に答える
2429

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

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

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

この悲しい話は醜い真実で終わります: 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の hostへの参照を渡すことになるため、これは機能しませActivityFragment。わお!したがって、フラグメントからキーボードを隠すために、私はより低レベルで、より一般的で、醜い方法に頼っています。

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"and/orfocusableInTouchMode="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();

于 2013-07-22T13:44:29.240 に答える
840

また、ソフトキーボードを非表示にするのに役立つのは次のとおりです。

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

これを使用して、ユーザーが実際に editText ビューに触れるまでソフト キーボードを非表示にすることができます。

于 2010-01-13T19:01:09.957 に答える
371

キーボードを非表示にするもう1つの解決策があります:

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

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

于 2012-02-29T05:31:23.817 に答える
165

Meier のソリューションは私にも有効です。私の場合、アプリの最上位はタブ ホストであり、タブを切り替えるときにキーワードを非表示にしたい - タブ ホスト ビューからウィンドウ トークンを取得します。

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}
于 2010-02-11T21:07:29.060 に答える
158

プログラムでAndroidソフトキーボードを閉じたり非表示にしたりする方法はたくさんあります。以下のコードでこれを試すことができます onCreate()

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

または、以下のコードでこれを試すことができます onCreate()

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
于 2009-12-04T10:01:27.450 に答える
146

更新: このソリューションが機能しなくなった理由がわかりません (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);
于 2011-08-17T14:06:15.177 に答える
101
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}
于 2012-05-04T04:02:00.073 に答える
84

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

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);
于 2012-01-28T00:41:35.553 に答える
64

その検索から、ここで私は自分に合った答えを見つけました

// 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);
于 2012-02-22T18:54:05.927 に答える
63

短い答え

あなたのOnClickリスナーonEditorActionEditTextIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

ドリルダウン

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


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

于 2014-08-04T13:09:54.490 に答える
48

カスタム キーボードを使用して 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古いバージョンの場合、ルートビューからa を使用して追加し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);
于 2012-05-03T21:28:46.650 に答える
32

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

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

于 2013-04-06T13:20:49.143 に答える
30

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

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
于 2013-09-04T22:38:51.243 に答える
26

この 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);
    }
}
于 2015-07-23T08:43:59.543 に答える
22

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

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();
}
于 2012-09-14T18:51:08.470 に答える
21

単体テストまたは機能テスト中にソフト キーボードを閉じたい場合は、テストの [戻る] ボタンをクリックして閉じることができます。

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

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

戻るボタンを閉じるのに少し時間がかかるため、先に進む前に少し一時停止してください。ビューなどへのその後のクリックは、短い一時停止の後まで登録されません (1 秒で十分な時間です)。 )。

于 2011-12-13T18:52:47.020 に答える
18

これがAndroid用Mono(別名MonoDroid)でそれを行う方法です

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
于 2012-05-15T01:36:10.267 に答える
17

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

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);
    }
}
于 2013-12-03T06:24:10.540 に答える
15

この最適化されたコードをアクティビティで使用するだけです。

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
于 2014-05-25T12:38:44.963 に答える
14

私は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 );
}
于 2014-12-03T15:30:56.810 に答える
12

これを使って

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2013-08-09T13:42:00.700 に答える
11

場合によっては、この方法は他のすべての方法を除いて機能します。これは私の一日を救います:)

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);
        }
    }
}
于 2016-02-04T11:46:12.027 に答える
11

私はこれらの答えをほとんどすべて試しましたが、特に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);
}
于 2015-05-15T12:40:06.430 に答える
11

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

InputMethodManager を使用してもキーボードが閉じませんでした。フォーカスをクリアし、検索ビューのフォーカス可能を false に設定する必要がありました。

mSearchView.clearFocus();
mSearchView.setFocusable(false);
于 2013-03-13T21:31:32.130 に答える
8

keyboard 場合によっては、属性を持っているEditTextボックスを指定して折り畳むための入力ボタンだけが必要な場合があります

 android:imeOptions="actionDone" 

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

于 2012-11-20T14:05:39.823 に答える
8

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

レイアウトに EditText と検索ボタンが含まれている非常に似たような状況がありました。editText で ime オプションを「actionSearch」に設定するだけでよいことを発見したとき、もう検索ボタンさえ必要ないことに気付きました。ソフト キーボード (このモードの場合) には検索アイコンがあり、これを使用して検索を開始できます (予想どおり、キーボードは自動的に閉じます)。

于 2012-06-23T01:00:02.963 に答える
7

AndroidX を使用して、キーボードを表示/非表示にする驚くべき方法を取得します。リリース ノート - 1.5.0-alpha02をお読みください。キーボードを非表示/表示する方法

val controller = view.windowInsetsController

// Show the keyboard
controller.show(Type.ime())
// Hide the keyboard
controller.hide(Type.ime())

自分の回答をリンクする Androidでソフトウェアキーボードの可視性を確認するには? そして、この変更の詳細 (それ以上) を含む素晴らしいブログ.

于 2020-08-26T10:55:44.690 に答える
6

わたしにはできる..

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

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

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

ここで、ボタンをクリックするとキーボードが非表示になり、EditText キーボードに触れると表示されます。

(また)

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2013-11-20T12:05:06.873 に答える
6

Java コードを使用してキーボードを非表示にする場合は、次を使用します。

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

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

 <activity
 android:name=".activities.MyActivity"
 android:configChanges="keyboardHidden"  />
于 2016-05-09T18:39:46.930 に答える
6

AndroidManifest.xmlアンダー<activity..>セットで android:windowSoftInputMode="stateAlwaysHidden"

于 2015-12-14T09:33:26.260 に答える
5

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

ジャワ

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);
}
于 2018-10-01T09:54:22.237 に答える
5

コトリンで

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)
    }
于 2018-08-16T04:52:26.777 に答える
5

ソフト キーボードを非表示にするには、このメソッドを呼び出します

public void hideKeyBoard() {
    View view1 = this.getCurrentFocus();
    if(view!= null){
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view1.getWindowToken(), 0);
    }
}
于 2018-10-31T05:55:52.397 に答える
4

単純なコード: onCreate()でこのコードを使用します

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
于 2016-01-24T06:19:00.743 に答える
4

これを試してください

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);
    }
}
于 2014-12-26T09:00:36.937 に答える
4

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

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);
        }
    }
于 2016-03-23T07:04:40.983 に答える
4

フラグメントからフラグメントへ移動する場合

fun hideKeyboard(activity: Activity?): Boolean {
    val inputManager = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    if (inputManager != null) {
        val currentFocus = activity?.currentFocus
        if (currentFocus != null) {
            val windowToken = currentFocus.windowToken
            if (windowToken != null) {
                return inputManager.hideSoftInputFromWindow(windowToken, 0)
            }
        }
    }
    return false
}

fun showKeyboard(editText: EditText) {
    val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(editText.windowToken, 0)
    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
    editText.requestFocus()
}
于 2020-02-17T07:21:59.823 に答える
3

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

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)

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

于 2019-02-20T08:33:44.390 に答える
3

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

                        // 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);
                            }
于 2017-12-20T12:17:52.463 に答える
3

汎用メソッドをユーティリティ クラスまたはヘルパー クラスに追加する。自分自身を呼び出すだけで、キーボードの表示と非表示を切り替えることができます

fun AppCompatActivity.hideKeyboard() {
            val view = this.currentFocus
            if (view != null) {
                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                imm.hideSoftInputFromWindow(view.windowToken, 0)
            }
           window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)

        }


 fun AppCompatActivity.showKeyboard() {
            val view = this.currentFocus
            if (view != null) {
                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                imm.hideSoftInputFromWindow(view.windowToken, 0)
            }                     window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)

        }
于 2020-01-15T10:30:39.397 に答える
2
private void hideSoftKeyboard() {
    View view = getView();
    if (view != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
                .getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}
于 2014-09-25T14:24:01.050 に答える
2

これらすべての答えにもかかわらず、簡単にするために、これを行うための一般的な方法を作成しました。

/**
 * 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);
    }
}
于 2014-10-31T02:33:12.073 に答える
2

一部は 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);
    }   
}
于 2012-12-18T01:36:53.447 に答える
2

この方法は、どんな犠牲を払っても常に機能します。キーボードを隠したい場所ならどこでも使用できます

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のバージョンは何でも構いません。この方法は必ず効きます

于 2013-10-04T07:11:47.660 に答える
2
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"

于 2014-01-18T18:54:11.863 に答える
2

別の使用方法は、次の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(). searchItemMenuItemデフォルト コードの一部ですonCreateOptionsmenu()。このコードのかなりの部分を提供してくれた @mckoss に感謝します。

于 2014-07-06T23:56:08.333 に答える
2

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()
于 2018-10-25T07:49:01.410 に答える
2
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

于 2019-02-16T11:22:15.390 に答える
2

任意のビューの拡張機能を作成できます

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

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

于 2018-07-23T02:32:40.527 に答える
2

これは私にとってはうまくいきます。その中に要素を渡すだけです。

InputMethodManager imm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(AutocompleteviewDoctorState.getWindowToken(), 0);
于 2020-10-03T04:53:28.393 に答える
1
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);
于 2016-12-07T10:14:34.673 に答える
1

それを 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();
}
于 2016-10-06T12:34:56.973 に答える
1

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);
}
于 2018-09-25T02:05:08.253 に答える
1
    hide soft keyboard in Kotlin using globally using method. For using globally in Kotlin you need to create Singletone class. In Kotlin we are using object keyword for creating Singletone class.
    
    
    object Extensions {
    
      fun View.hideKeyboard() {
            val inputMethodManager =                                                 
            context.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE)           
            as InputMethodManager
            inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
        }
    }

In your activity of fragment class where you need to hide the keyboard you can call this function with mainlayout id like below

//constraintEditLayout is my main view layout, if you are using other layout like relative or linear layouts you can call with that layout id
constraintEditLayout.hideKeyboard()
于 2021-06-13T09:57:55.813 に答える
-1

簡単な方法は、EditText ビューで以下の属性を設定することです。

android:imeOptions="actionDone" 
于 2019-12-23T08:48:34.260 に答える
-5

これは私のために働く:

 @Override
 public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);

if (v instanceof EditText) {
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = event.getRawX() + w.getLeft() - scrcoords[0];
    float y = event.getRawY() + w.getTop() - scrcoords[1];

    Log.d("Activity",
            "Touch event " + event.getRawX() + "," + event.getRawY()
                    + " " + x + "," + y + " rect " + w.getLeft() + ","
                    + w.getTop() + "," + w.getRight() + ","
                    + w.getBottom() + " coords " + scrcoords[0] + ","
                    + scrcoords[1]);
    if (event.getAction() == MotionEvent.ACTION_UP
            && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                    .getBottom())) {

        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                .getWindowToken(), 0);
    }
}
return ret;
}
于 2013-10-24T11:01:18.917 に答える