私が持っているEditText
とButton
私のレイアウトでは。
編集フィールドに書き込んでをクリックしたButton
後、仮想キーボードを非表示にします。これは簡単なコードだと思いますが、その例はどこにありますか?
キーボードの外側に触れたとき。
私が持っているEditText
とButton
私のレイアウトでは。
編集フィールドに書き込んでをクリックしたButton
後、仮想キーボードを非表示にします。これは簡単なコードだと思いますが、その例はどこにありますか?
キーボードの外側に触れたとき。
回答:
この狂気を明確にするのを助けるために、私はすべてのAndroidユーザーに代わってGoogleのソフトキーボードのまったくとんでもない扱いについて謝罪することから始めたいと思います。同じ単純な質問に対して、それぞれ異なる多数の回答がある理由は、このAPIがAndroidの他の多くのAPIと同様に恐ろしく設計されているためです。丁寧な言い方は考えられません。
キーボードを非表示にしたい。Androidに次のステートメントを提供する予定ですKeyboard.hide()
。終わり。どうもありがとうございました。しかし、Androidには問題があります。を使用しInputMethodManager
てキーボードを非表示にする必要があります。わかりました、これはキーボードに対するAndroidのAPIです。だが!Context
IMMにアクセスするには、が必要です。今問題があります。何も使用しない、または必要としない静的クラスまたはユーティリティクラスからキーボードを非表示にしたい場合があります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();
Fragment
使用できるようですgetActivity().getWindow().getDecorView()
Keyboard.hide();
ユーティリティを提供するべきです
あなたは使用して、仮想キーボードを非表示にするアンドロイドを強制することができ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)
}
editText.clearFocus()
その後、呼び出しInputMethodManager.HIDE_IMPLICIT_ONLY
も機能します4.1
View focused = getCurrentFocus()
たのは、現在フォーカスされているビューを確実に取得するために実行し、を呼び出しfocused.clearFocus()
てからinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 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
の位置でshowFlag
と0
の位置に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);
editView.setInputType(InputType.TYPE_NULL);
更新: このソリューションが機能しなくなった理由がわかりません(Android 23でテストしました)。代わりにSaurabh Pareekのソリューションを使用してください。ここにあります:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
古い答え:
//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
I don't know why this solution is not work any more
-Androidであるため、すべてが変更される可能性があります。デザインの一部が不適切である可能性があります...不注意に書き込んだ後、すべてを取り消してすべてを書き換えます。
protected void hideSoftKeyboard(EditText input) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
。
input.setInputType(0);
このコードから削除しました。キーボードの動作とinputType
を変更しましたEditText
。
ここにある他のすべての回答が期待どおりに機能しない場合は、キーボードを手動で制御する別の方法があります。
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 ... */
}
fragment.getActivity().getSystemService();
検索してみたところ、ここで私に役立つ答えが見つかりました
// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
あなたにはOnClick
、リスナーのコールonEditorAction
のEditText
とIME_ACTION_DONE
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
この方法は、Androidのデザインパターンによりよく、よりシンプルで、より整合していると思います。上記の簡単な例では(通常、ほとんどの一般的なケースで)、EditText
フォーカスがある/持っています。また、通常、最初にキーボードを呼び出すものでした(多くの場合、間違いなくキーボードを呼び出すことができます)一般的なシナリオ)。同じように、それはキーボードを解放するものでなければならない、通常、そのことによって行うことができますImeAction
。EditText
withのandroid:imeOptions="actionDone"
動作を確認するだけで、同じ方法で同じ動作を実現できます。
この関連する答えを確認してください
これはうまくいくはずです:
public class KeyBoard {
public static void show(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
}
public static void hide(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
}
public static void toggle(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()){
hide(activity);
} else {
show(activity);
}
}
}
KeyBoard.toggle(activity);
hide()
とshow()
メソッドを補足して、表示するタイミングと表示しないタイミングをより細かく制御できます。私のために働く、私もそれをやった:)私は例を編集します
KeyBoard.toggle(fragment.getActivity())
Fragment
、コメント付きのように、メソッドをとは異なる方法で呼び出します。メソッドの使い方を学び、戻ってきてください。あなたは愚かな返信で人々を混乱させています
カスタムキーボードを使用して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日以上かけて作業してきましたが、何らかの形でそれらが不足していることがわかりました。私の正確な要件は、100%の信頼性で画面上のキーボードを表示または非表示にするボタンを用意することです。キーボードが非表示の状態の場合、ユーザーがどの入力フィールドをクリックしても、再表示されません。ユーザーがどのボタンをクリックしても、それが表示されている状態の場合、キーボードは消えないはずです。これは、Android 2.2以降で最新のデバイスまで動作する必要があります。
あなたは私のアプリクリーンRPNでこれの実用的な実装を見ることができます。
いくつかの異なる電話(froyoおよびgingerbreadデバイスを含む)で提案された回答の多くをテストした後、Androidアプリが確実にできることが明らかになりました:
私にとって、キーボードを一時的に非表示にするだけでは不十分です。一部のデバイスでは、新しいテキストフィールドがフォーカスされるとすぐに再表示されます。私のアプリは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()をオーバーライドしてデバイスのホーム画面に戻ることができます。
このオールアラウンドソリューションの代わりに、キーボードを開くために使用された(EditText)フィールドを参照せずにどこからでもソフトキーボードを閉じたいが、フィールドがフォーカスされている場合でもそれを実行したい場合は、これ(アクティビティから):
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
このSOの回答のおかげで、私は次のように導きました。私の場合、ViewPagerのフラグメントをスクロールするときにうまく機能します...
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
private void showKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
上記の回答はさまざまなシナリオで機能しますが 、ビュー内でキーボードを非表示にして適切なコンテキストを取得するのに苦労している場合は、これを試してください:
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyBoardOnTabClicked(v);
}
}
private void hideSoftKeyBoardOnTabClicked(View v) {
if (v != null && context != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
コンテキストを取得するには、コンストラクタからフェッチします:)
public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
ユニットテストまたは機能テスト中にソフトキーボードを閉じる場合は、テストの[戻る]ボタンをクリックして終了できます。
// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
上記はonBackPressed()
問題のアクティビティのをトリガーしないため、「戻るボタン」を引用符で囲みます。キーボードを閉じるだけです。
[戻る]ボタンを閉じるには少し時間がかかるため、次に進む前に少し間を置いてください。これにより、ビューなどへの後続のクリックは、少し間を置くまで登録されません(1秒は十分長い時間です) )。
Mono for Android(別名MonoDroid)での実行方法は次のとおりです
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
searchbox
スニペットには何がありますか?
これは、すべての奇妙なキーボードの動作に対して私にとってうまくいきました
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"/>
シンプルで使いやすいメソッド。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);
}
この最適化されたコードをアクティビティで使用してください:
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
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を使用して、検索ビューのfocusableをfalseに設定する必要がありました。
mSearchView.clearFocus();
mSearchView.setFocusable(false);
clearFocus()
Android APIページにがないため、これは私には機能しませんでしたが、別のソリューションでは機能しました(以下の私の回答を参照)。
私もにいる場合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 );
}
私はこれらすべての答えをほとんど試しましたが、特に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);
}