EditText
レイアウトにとがありButton
ます。
編集フィールドに書き込み、 をクリックした後Button
、キーボードの外側に触れたときに仮想キーボードを非表示にしたい。これは単純なコードだと思いますが、その例はどこにありますか?
EditText
レイアウトにとがありButton
ます。
編集フィールドに書き込み、 をクリックした後Button
、キーボードの外側に触れたときに仮想キーボードを非表示にしたい。これは単純なコードだと思いますが、その例はどこにありますか?
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)
}
この狂気を明らかにするために、すべての Android ユーザーを代表して、Google によるソフト キーボードのまったくばかげた扱いについて謝罪することから始めたいと思います。同じ単純な質問に対して非常に多くの回答があり、それぞれが異なる理由は、この API が Android の他の多くの API と同様に恐ろしく設計されているためです。丁寧な言い方が思いつきません。
キーボードを隠したい。Android に次のステートメントを提供する予定です: Keyboard.hide()
. 終わり。どうもありがとうございました。しかし、Androidには問題があります。InputMethodManager
キーボードを非表示にするには、 を使用する必要があります。わかりました。これはキーボードに対する Android の API です。しかし!Context
IMM にアクセスするには、 が必要です。今、問題があります。キーボードを使用しない、または必要としない静的クラスまたはユーティリティ クラスからキーボードを隠したい場合があります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への参照を渡すことになるため、これは機能しませ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"
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();
また、ソフトキーボードを非表示にするのに役立つのは次のとおりです。
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
これを使用して、ユーザーが実際に editText ビューに触れるまでソフト キーボードを非表示にすることができます。
キーボードを非表示にするもう1つの解決策があります:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
HIDE_IMPLICIT_ONLY
ここでは の位置と の位置showFlag
で0
渡しますhiddenFlag
。ソフトキーボードを強制的に閉じます。
Meier のソリューションは私にも有効です。私の場合、アプリの最上位はタブ ホストであり、タブを切り替えるときにキーワードを非表示にしたい - タブ ホスト ビューからウィンドウ トークンを取得します。
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
}
}
プログラムでAndroidソフトキーボードを閉じたり非表示にしたりする方法はたくさんあります。以下のコードでこれを試すことができます onCreate()
EditText edtView = (EditText) findViewById(R.id.editTextConvertValue);
edtView.setInputType(InputType.TYPE_NULL);
または、以下のコードでこれを試すことができます onCreate()
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
更新: このソリューションが機能しなくなった理由がわかりません (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);
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);
その検索から、ここで私は自分に合った答えを見つけました
// 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"
。同じ方法で同じ動作を実現したいと考えています。
カスタム キーボードを使用して 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);
スレッドに投稿されたすべての解決策に 2 日以上を費やしましたが、何らかの形で不足していることに気付きました。私の正確な要件は、100% の信頼性でオンスクリーン キーボードを表示または非表示にするボタンを用意することです。キーボードが非表示の状態にある場合、ユーザーがどの入力フィールドをクリックしても、キーボードは再表示されません。表示状態にあるときは、ユーザーがどのボタンをクリックしても、キーボードが消えることはありません。これは、Android 2.2 以降から最新のデバイスまで、すべて動作する必要があります。
私のアプリclean RPNで、これの実際の実装を確認できます。
提案された回答の多くをさまざまな携帯電話 (froyo やジンジャーブレッド デバイスを含む) でテストした結果、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 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);
}
}
上記の回答はさまざまなシナリオで機能し ますが、ビュー内にキーボードを非表示にし、適切なコンテキストを取得するのに苦労している場合は、これを試してください:
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 秒で十分な時間です)。 )。
これがAndroid用Mono(別名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);
}
}
この最適化されたコードをアクティビティで使用するだけです。
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
私は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 );
}
これを使って
this.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);
}
}
}
私はこれらの答えをほとんどすべて試しましたが、特に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);
}
私の場合、アクションバーで SearchView を使用していました。ユーザーが検索を実行した後、キーボードが再び開きます。
InputMethodManager を使用してもキーボードが閉じませんでした。フォーカスをクリアし、検索ビューのフォーカス可能を false に設定する必要がありました。
mSearchView.clearFocus();
mSearchView.setFocusable(false);
keyboard
場合によっては、属性を持っているEditText
ボックスを指定して折り畳むための入力ボタンだけが必要な場合があります
android:imeOptions="actionDone"
これにより、[Enter] ボタンがキーボードを閉じる [Done] ボタンに変わります。
EditTextで setImeOptionを使用することも検討できます。
レイアウトに EditText と検索ボタンが含まれている非常に似たような状況がありました。editText で ime オプションを「actionSearch」に設定するだけでよいことを発見したとき、もう検索ボタンさえ必要ないことに気付きました。ソフト キーボード (このモードの場合) には検索アイコンがあり、これを使用して検索を開始できます (予想どおり、キーボードは自動的に閉じます)。
AndroidX を使用して、キーボードを表示/非表示にする驚くべき方法を取得します。リリース ノート - 1.5.0-alpha02をお読みください。キーボードを非表示/表示する方法
val controller = view.windowInsetsController
// Show the keyboard
controller.show(Type.ime())
// Hide the keyboard
controller.hide(Type.ime())
自分の回答をリンクする Androidでソフトウェアキーボードの可視性を確認するには? そして、この変更の詳細 (それ以上) を含む素晴らしいブログ.
わたしにはできる..
EditText editText=(EditText)findViewById(R.id.edittext1);
onClick() のコード行の下に置く
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
ここで、ボタンをクリックするとキーボードが非表示になり、EditText キーボードに触れると表示されます。
(また)
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Java コードを使用してキーボードを非表示にする場合は、次を使用します。
InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(fEmail.getWindowToken(), 0);
または、キーボードを常に非表示にしたい場合は、AndroidManifest でこれを使用します。
<activity
android:name=".activities.MyActivity"
android:configChanges="keyboardHidden" />
AndroidManifest.xml
アンダー<activity..>
セットで android:windowSoftInputMode="stateAlwaysHidden"
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);
}
コトリンで
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)
}
ソフト キーボードを非表示にするには、このメソッドを呼び出します
public void hideKeyBoard() {
View view1 = this.getCurrentFocus();
if(view!= null){
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view1.getWindowToken(), 0);
}
}
単純なコード: onCreate()でこのコードを使用します
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
これを試してください
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);
}
}
簡単な方法の人:これを試してください...
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);
}
}
フラグメントからフラグメントへ移動する場合
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()
}
以下のコードは、どこからでも呼び出すことができる汎用関数を作成するのに役立ちます。
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)
ビューは、アクティビティのルート レイアウトなど、何でもかまいません。
ソフトキーボードを非表示にしたい場所にこのコードを追加するだけです。」
// 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);
}
汎用メソッドをユーティリティ クラスまたはヘルパー クラスに追加する。自分自身を呼び出すだけで、キーボードの表示と非表示を切り替えることができます
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)
}
private void hideSoftKeyboard() {
View view = getView();
if (view != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
これらすべての答えにもかかわらず、簡単にするために、これを行うための一般的な方法を作成しました。
/**
* 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);
}
}
一部は 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);
}
}
この方法は、どんな犠牲を払っても常に機能します。キーボードを隠したい場所ならどこでも使用できます
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のバージョンは何でも構いません。この方法は必ず効きます
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"
。
別の使用方法は、次のSearchView
コードを使用することです。
searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
InputMethodManager imm = (InputMethodManager)
getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getApplicationWindowToken(), 0);
}
}
これは ActionBar の SearchView 検索ボックスで、クエリからのテキストが送信されると (ユーザーがEnter
キーまたは検索ボタン/アイコンを押すと)、InputMethodManager
コードがアクティブになり、ソフト キーボードがダウンします。このコードは私のonCreateOptionsMenu()
. searchItem
のMenuItem
デフォルト コードの一部ですonCreateOptionsmenu()
。このコードのかなりの部分を提供してくれた @mckoss に感謝します。
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()
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
任意のビューの拡張機能を作成できます
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();
ハッピーコーディング...
これは私にとってはうまくいきます。その中に要素を渡すだけです。
InputMethodManager imm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(AutocompleteviewDoctorState.getWindowToken(), 0);
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);
それを 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();
}
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);
}
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()
簡単な方法は、EditText ビューで以下の属性を設定することです。
android:imeOptions="actionDone"
これは私のために働く:
@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;
}