私のレイアウトにはEditText
とButton
があります。
編集欄に書いてButton
をクリックしたら、仮想キーボードを隠したいです。これは単純なコードだと思いますが、その例はどこにありますか。
この狂気を明確にするために、私はすべてのAndroidユーザーに代わってGoogleのソフトキーボードの実に馬鹿げた扱いを謝罪することから始めたいと思います。このAPIは、Androidの他の多くのAPIと同様に恐ろしく設計されているため、同じ単純な質問に対して非常に多くの回答が存在する理由です。私はそれを述べる丁寧な方法を考えることができません。
キーボードを非表示にします。 Androidに次のステートメントを提供する予定です:Keyboard.hide()
。終わり。どうもありがとうございました。ただし、Androidには問題があります。キーボードを非表示にするには、InputMethodManager
を使用する必要があります。いいでしょう、これはキーボードに対するAndroidのAPIです。しかし! IMMにアクセスするには、Context
が必要です。今、問題があります。 Context
を使用または必要としない静的またはユーティリティクラスからキーボードを非表示にすることができます。またはさらに悪いことに、IMMでは、キーボードを非表示にするView
(またはさらに悪いことに、Window
)を指定する必要があります。
これが、キーボードの非表示を非常に困難にしている理由です。親愛なるGoogle:ケーキのレシピを検索しているとき、地球上にRecipeProvider
はありません。ケーキを食べる人と食べる場所に最初に答えない限り、レシピの提供を拒否しません。
この悲しい話はendsい真実で終わります。Androidキーボードを非表示にするには、2つの形式の識別情報を提供する必要があります: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(通常はソフトキーボード)は、それ自体を表示することでフォーカスイベントに応答します。 AndroidManifest.xml
のwindowSoftInputMode
属性は、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();
フォーカスされたビューを含むウィンドウのトークンを渡して、 InputMethodManager を使用して hideSoftInputFromWindow
を使用して、Androidに仮想キーボードを非表示にさせることができます。
// 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
を使用してください。
コトリンの構文
// 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);
ここでは、showFlag
の位置にHIDE_IMPLICIT_ONLY
を、hiddenFlag
の位置に0
を渡します。ソフトキーボードを強制的に閉じます。
マイヤーの解決策も私のために働く。私の場合、私のアプリのトップレベルは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でテストしました)。代わりに 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);
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
リスナーで、IME_ACTION_DONE
でonEditorAction
のEditText
を呼び出します
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
この方法は、Androidの設計パターンにより良く、シンプルで、より整合していると感じています。上記の簡単な例(そして通常はほとんどの場合)では、EditText
にフォーカスがある/持っていて、通常最初にキーボードを呼び出すものでもあります(間違いなく可能です)多くの一般的なシナリオで呼び出します)。同じように、itはキーボードをリリースするものでなければならず、通常はImeAction
で実行できます。 Android:imeOptions="actionDone"
を含むEditText
の動作を確認するだけで、同じ手段で同じ動作を実現できます。
これを確認してください 関連する回答
これはうまくいくはずです。
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では、TextViewにフォーカスが移ったときに天気を制御したり、キーボードを表示しないようにsetSoftInputShownOnFocus(boolean show)
が追加されましたが、それでもまだ隠れているので、リフレクションを使用する必要があります。
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や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);
}
}
これにより、現在のアクティビティの状態がBundleに保存され、その後アクティビティが開始され、キーボードを表示するか非表示にするかを示すブール値が渡されます。
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)フィールドを参照せずにソフトキーボードどこからでもを閉じたいが、それでもやりたい場合は、 this all around solution の代わりに_ /フィールドがフォーカスされている場合は、(Activityから)これを使用できます。
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
this 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秒で十分です) ).
これは、Mono for Android(AKA MonoDroid)で行う方法です
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
マニフェストファイルのAndroid:windowSoftInputMode="stateHidden"
をあなたのアクティビティに追加してください。例:
<activity
Android:name=".ui.activity.MainActivity"
Android:label="@string/mainactivity"
Android:windowSoftInputMode="stateHidden"/>
これは私にとって奇妙なキーボードの振る舞いのすべてに役立ちました
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);
}
}
私の場合は、アクションバーにSearchViewを使用していました。ユーザーが検索を実行した後、キーボードが再び開きます。
InputMethodManagerを使用してもキーボードが閉じませんでした。私はclearFocusし、検索ビューのフォーカス可能をfalseに設定しなければなりませんでした:
mSearchView.clearFocus();
mSearchView.setFocusable(false);
私はほとんどすべての答えを試してみました、私は特にサムスン銀河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);
}
}
}
シンプルで使いやすいメソッドです。 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);
}
これを使って
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
私は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 );
}
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;
}
});
あなたの活動にこの最適化されたコードを使うだけです:
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
毎回魔法のような働きをする
private void closeKeyboard() {
InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
private void openKeyboard() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}
}
オープンキーボードの場合:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);
キーボードを閉じる/隠す
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
EditTextで setImeOption を使うことも検討できます。
私のレイアウトにEditTextと検索ボタンが含まれているという非常に似たような状況がありました。私のeditTextでimeオプションを "actionSearch"に設定できることを発見したとき、私はもう検索ボタンさえ必要としないことに気づきました。 (このモードの)ソフトキーボードには検索アイコンがあり、これを使って検索を開始することができます(そして期待通りにキーボードが閉じます)。
時々あなたが望むのはあなたが属性を持っているkeyboard
ボックスを与えるEditText
を折り込むためのエンターボタンだけです
Android:imeOptions="actionDone"
これにより、EnterボタンがDoneボタンに変わり、キーボードが閉じます。
わたしにはできる..
EditText editText=(EditText)findViewById(R.id.edittext1);
onClick()のコード行の下に配置
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
ここでButtonをクリックしたときにキーボードを隠し、EditTextキーボードに触れると表示されます。
(OR)
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
場合によっては、editTextを含む行を含むリストビューを含むアクティビティがある可能性があるので、マニフェストSOFT_INPUT_ADJUST_PAN
で設定する必要があります。そうすると、それらのキーボードには迷惑なものが表示されます。
次の回避策は、onCreate
の末尾に配置すると機能します。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
},100);
Activity
を呼び出すことができます簡単 public static void hideKeyboardwithoutPopulate(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(), 0);
}
MainActivitiy
でこれを呼び出します hideKeyboardwithoutPopulate(MainActivity.this);
AndroidManifest.xml
の下の<activity..>
でAndroid:windowSoftInputMode="stateAlwaysHidden"
を設定します
Javaコードを使ってキーボードを隠したい場合は、次のようにします。
InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(fEmail.getWindowToken(), 0);
キーボードを常に隠したい場合は、AndroidManifestでこれを使用します。
<activity
Android:name=".activities.MyActivity"
Android:configChanges="keyboardHidden" />
もし興味があるなら、私はKotlinのために小さなエクステンションを書きました。
fun Fragment.hideKeyboard(context: Context = App.instance) {
val windowToken = view?.rootView?.windowToken
windowToken?.let {
val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
}
}
App.instanceは、Applicationに格納されている静的な "this"アプリケーションオブジェクトです。
更新:場合によっては、windowTokenがnullになります。キーボードが閉じているかどうかを検出するためにリフレクションを使ってキーボードを閉じる方法を追加しました。
/**
* If no window token is found, keyboard is checked using reflection to know if keyboard visibility toggle is needed
*
* @param useReflection - whether to use reflection in case of no window token or not
*/
fun Fragment.hideKeyboard(context: Context = MainApp.instance, useReflection: Boolean = true) {
val windowToken = view?.rootView?.windowToken
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
windowToken?.let {
imm.hideSoftInputFromWindow(windowToken, 0)
} ?: run {
if (useReflection) {
try {
if (getKeyboardHeight(imm) > 0) {
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
}
} catch (exception: Exception) {
Timber.e(exception)
}
}
}
}
fun getKeyboardHeight(imm: InputMethodManager): Int = InputMethodManager::class.Java.getMethod("getInputMethodWindowVisibleHeight").invoke(imm) as Int
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
これは働いています..
現在のアクティビティインスタンスを関数に渡すだけです
public void isKeyBoardShow(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
} else {
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
}
}
実際には、Android権限は常に新しい更新を与えていますが、すべてのAndroid開発者が開発時に直面していた古い欠点を処理していません。しかし、残念ながら、彼らは管理していません。はい、それを残します。
以下は、ActivityまたはFragmentでキーボードオプションを表示/非表示/切り替えするための解決策です。
ビューのキーボードを表示します。
/**
* open soft keyboard.
*
* @param context
* @param view
*/
public static void showKeyBoard(Context context, View view) {
try {
InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(view, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
アクティビティのコンテキストでキーボードを表示する:
/**
* open soft keyboard.
*
* @param mActivity context
*/
public static void showKeyBoard(Activity mActivity) {
try {
View view = mActivity.getCurrentFocus();
if (view != null) {
InputMethodManager keyboard = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
}
} catch (Exception e) {
e.printStackTrace();
}
}
フラグメントコンテキストでキーボードを表示する:
/**
* open soft keyboard.
*
* @param mFragment context
*/
public static void showKeyBoard(Fragment mFragment) {
try {
if (mFragment == null || mFragment.getActivity() == null) {
return;
}
View view = mFragment.getActivity().getCurrentFocus();
if (view != null) {
InputMethodManager keyboard = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
}
} catch (Exception e) {
e.printStackTrace();
}
}
ビューのキーボードを隠す:
/**
* close soft keyboard.
*
* @param context
* @param view
*/
public static void hideKeyBoard(Context context, View view) {
try {
InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
} catch (Exception e) {
e.printStackTrace();
}
}
アクティビティのコンテキストでキーボードを隠す:
/**
* close opened soft keyboard.
*
* @param mActivity context
*/
public static void hideSoftKeyboard(Activity mActivity) {
try {
View view = mActivity.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
フラグメントコンテキストでキーボードを隠す:
/**
* close opened soft keyboard.
*
* @param mFragment context
*/
public static void hideSoftKeyboard(Fragment mFragment) {
try {
if (mFragment == null || mFragment.getActivity() == null) {
return;
}
View view = mFragment.getActivity().getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
キーボードの切り替え:
/**
* toggle soft keyboard.
*
* @param context
*/
public static void toggleSoftKeyboard(Context context) {
try {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
単にコード: onCreate()でこのコードを使用してください
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
これは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);
}
あなたがあなたのアプリケーションを開発するためにKotlinを使うならば、それは本当にするのが簡単です。
この拡張機能を追加します。
活動のために:
fun Activity.hideKeyboard() {
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val view = currentFocus
if (view != null) {
inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
フラグメントの場合:
fun Fragment.hideKeyboard() {
activity?.let {
val inputManager = it.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val view = it.currentFocus
if (view != null) {
inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
}
これで、あなたはあなたのFragmentまたはActivityで簡単に呼ぶことができます:
hideKeyboard()
final RelativeLayout llLogin = (RelativeLayout) findViewById(R.id.rl_main);
llLogin.setOnTouchListener(
new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent ev) {
InputMethodManager imm = (InputMethodManager) this.getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
return false;
}
});
これを試してください
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);
}
}
とても簡単な方法
私はすべてのプロジェクトでこれを行い、夢のように働きます。あなたの宣言にlayout.xml
はこの一行を追加するだけです:
Android:focusableInTouchMode="true"
完全なコード例:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:focusableInTouchMode="true">
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
<ListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
</ListView>
</Android.support.constraint.ConstraintLayout>
これが最善の解決策です。
解決策1)inputTypeを“ text”に設定します
<EditText
Android:id="@+id/my_edit_text"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:hint="Tap here to type"
Android:inputType="text" />
これはプログラムによっても可能です。メソッドsetInputType()(TextViewから継承)
EditText editText = (EditText) findViewById(R.id.my_edit_text);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_NORMAL);
解決策2)InputMethodManager.hideSoftInputFromWindow()を使用してください。
InputMethodManager imm =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
または
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
簡単な方法みんな:これを試してください...
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);
}
}
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity
.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus()
.getWindowToken(), 0);
}
簡単な回避策は、ボタンeditText.setEnabled(false);editText.setEnabled(true);
メソッドでonClick()
することです。
ボタンをクリックしたときに手動でキーボードを隠したい場合:
/**
* Hides the already popped up keyboard from the screen.
*
*/
public void hideKeyboard() {
try {
// use application level context to avoid unnecessary leaks.
InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
assert inputManager != null;
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
} catch (Exception e) {
e.printStackTrace();
}
}
edittext以外のときに画面のどこをクリックしてもキーボードを非表示にしたい場合 あなたの活動の中でこのメソッドをオーバーライドしてください:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View view = getCurrentFocus();
if (view != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("Android.webkit.")) {
int scrcoords[] = new int[2];
view.getLocationOnScreen(scrcoords);
float x = ev.getRawX() + view.getLeft() - scrcoords[0];
float y = ev.getRawY() + view.getTop() - scrcoords[1];
if (x < view.getLeft() || x > view.getRight() || y < view.getTop() || y > view.getBottom())
((InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow((this.getWindow().getDecorView().getApplicationWindowToken()), 0);
}
return super.dispatchTouchEvent(ev);
}
Androidでは、InputMethodManageによってVキーボードを非表示にするために、フォーカスされたビューを含むウィンドウのトークンを渡すことによってhideSoftInputFromWindowを呼び出すことができます。
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager im =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
EditText.clearFocus()を呼び出してからInputMethodManager.HIDE_IMPLICIT_ONLYを呼び出すことでも機能する
ソフトキーボードを隠したい場所にこのコードを追加するだけです。」
// 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 hideKeyboard(activity: BaseActivity) {
val view = activity.currentFocus?: View(activity)
val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 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 hideKeyboard(Activity act, EditText et){
Context c = act.getBaseContext();
View v = et.findFocus();
if(v == null)
return;
InputMethodManager inputManager = (InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
すべての方法を組み合わせて、必死でここですべて試してみました、そしてもちろんキーボードはアンドロイド4.0.3(それはハニカムAFAIRで動作しました)で閉じません。
それから突然、私は明らかに勝つ組み合わせを見つけました:
textField.setRawInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_NORMAL);
あなたのいつものレシピと組み合わせる
blahblaj.hideSoftInputFromWindow ...
これが誰かが自殺するのを止めることを願っています..私はそれに近かった。もちろん、それが機能する理由はわかりません。
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
は、onCreateOptionsmenu()
のデフォルトコードの一部であるMenuItem
からのものです。このコードをたくさん寄せてくれた@mckossに感謝します。
あなたは Extension どんなビューに対してもfunctionを作成することができます
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();
ハッピーコーディング...
ソフトキーボードを隠すにはこのメソッドを呼び出します。
public void hideKeyBoard() {
View view1 = this.getCurrentFocus();
if(view!= null){
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view1.getWindowToken(), 0);
}
}
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"
を設定することはできません。
これらすべての答えにもかかわらず、十分に単純にするために、私はこれを行うための共通の方法を書きました。
/**
* 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);
}
}
上記のすべての回答と別の投稿を読んだ後、キーボードを自動的に開くことができませんでした。
私のプロジェクトでは、ダイアログ(AlertDialog
)を動的に作成しました(必要な最小限のXMLを使用して、または使用せずにプログラミングすることにより)。
だから私は次のようなことをしていました:
dialogBuilder = new AlertDialog.Builder(activity);
if(dialogBuilder==null)
return false; //error
inflater = activity.getLayoutInflater();
dialogView = inflater.inflate(layout, null);
...
そして、すべてのビュー(TextView、ImageView、EditTextなど)のセットアップを完了した後、次のことを行いました。
alertDialog = dialogBuilder.create();
alertDialog.show();
すべての答えで遊んだ後、それらのほとんどが動作することがわかりましたIFご存知ここで、はリクエストを入れるために...そしてそれがすべての鍵でした。
だから、トリックはそれを置くことですの前にダイアログの作成:私の場合、alertDialog.show()
、これは魅力のように機能しました:
alertDialog = dialogBuilder.create();
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//And only when everything is finished - let's bring up the window -
alertDialog.show();
//Viola... keyboard is waiting for you open and ready...
//Just don't forget to request focus for the needed view (i.e. EditText..)
この原則はすべてのウィンドウで同じであると確信しているため、「showKeyboard」コードの場所に注意してください。ウィンドウが起動する前でなければなりません。
Android SDK開発チームからの小さなリクエスト:
世界中の何千人ものプログラマーがこのばかげた些細な問題を扱っているのを見ることができるので、これはすべて不要だと思いますが、その解決策はきれいでシンプルでなければなりません:入力指向のビューにrequestFocus()
を取得する場合EditText
として)、ユーザーがそうしないように要求しない限り、キーボードが自動的に開くので、requestFocus()メソッドがここのキーであり、true
のデフォルト値を持つboolean showSoftKeyboardを受け入れるべきだと思います:View.requestFocus(boolean showSoftKeyboard);
これが私のような人に役立つことを願っています。
以下のコードは、どこからでも呼び出せる汎用関数を作るのに役立ちます。
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)
viewは、アクティビティのルートレイアウトなど何でも構いません。
やあこんにちはこれはあなたがあなたの活動が例えばonCreate()でそれがロードされるときあなたの活動の最初にあまりにも早くコードをJavaに変換することができると信じて私があなたが活動をロードするとき簡単である。
fun hideKeybord (){
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (inputManager.isAcceptingText){
inputManager.hideSoftInputFromWindow(currentFocus.windowToken, 0)
}
}
私があなたのonCreate()メソードでこの関数を呼び出した後、manafest.xmlファイルのあなたのアクティビティにこのAndroid:windowSoftInputMode="stateAlwaysHidden"
行を追加します。
<activity
Android:name=".Activity.MainActivity"
Android:label="@string/app_name"
Android:theme="@style/AppTheme.NoActionBar"
Android:windowSoftInputMode="stateAlwaysHidden">
そこにいるkotlinユーザーのためにここに私のユースケースのために働いたkotlin拡張方法があります:
fun View.hideKeyboard() {
val imm = this.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
}
それをViewExtensions(またはあなたが持っているもの)と呼ばれるファイルに入れて、通常の方法のようにあなたのビューでそれを呼び出します。
アプリケーションが APIレベル21以上をターゲットにしている場合 使用するデフォルトの方法があります
editTextObj.setShowSoftInputOnFocus(false);
EditText
XMLタグに以下のコードを設定したことを確認してください。
<EditText
....
Android:enabled="true"
Android:focusable="true" />
これは私の仕事でした。キーボードを隠すためにKotlinにあります。
private fun hideKeyboard() {
val inputManager = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val focusedView = activity?.currentFocus
if (focusedView != null) {
inputManager.hideSoftInputFromWindow(focusedView.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS)
}
}
このコードスニペットは役に立ちます。
final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
if (inputMethodManager != null && inputMethodManager.isActive()) {
if (getCurrentFocus() != null) {
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
必要に応じてさまざまなメソッドで呼び出すことができます(onPause、onResume、onRestartなど)。
私は以下のKotlin Activity拡張機能を使っています:
/**
* Hides soft keyboard if is open.
*/
fun Activity.hideKeyboard() {
currentFocus?.windowToken?.let {
(getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
?.hideSoftInputFromWindow(it, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
/**
* Shows soft keyboard and request focus to given view.
*/
fun Activity.showKeyboard(view: View) {
view.requestFocus()
currentFocus?.windowToken?.let {
(getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
}
アプリケーション起動時にキーボードを表示するには
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
view.requestFocus();
new Handler().postDelayed(new Runnable() {
public void run() {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
}, 1000);
まず、次のようにXMLファイルからAndroid:imeOptionsフィールドを追加し、その値をactionUnspecified | actionGoに追加する必要があります
<Android.support.design.widget.TextInputEditText
Android:id="@+id/edit_text_id"
Android:layout_width="fill_parent"
Android:layout_height="@dimen/edit_text_height"
Android:imeOptions="actionUnspecified|actionGo"
/>
次に、JavaクラスにsetOnEditorActionListenerを追加し、以下のようにInputMethodManagerを追加します
enterOrderNumber.setOnEditorActionListener(new TextView.OnEditorActionListener(){
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_GO) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
return true;
}
return false;
}
});
コトリン版
val imm: InputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 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();
}
私はすべての解決策を非常に試してみましたが、解決策が私のために働かないので、私は私の解決策を見つけました:あなたは次のようなブール変数を持つべきです:
public static isKeyboardShowing = false;
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
そして、タッチスクリーンのイベントではあなたが呼ぶ:
@Override
public boolean onTouchEvent(MotionEvent event) {
if(keyboardShowing==true){
inputMethodManager.toggleSoftInput(InputMethodManager.RESULT_UNCHANGED_HIDDEN, 0);
keyboardShowing = false;
}
return super.onTouchEvent(event);
}
そしてEditTextではどこにでもあります:
yourEditText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
yourClass.keyboardShowing = true;
}
});
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);
}
特定のアクティビティでAndroidManifestに次の行を追加するだけです。
<activity
Android:name=".MainActivity"
Android:screenOrientation="portrait">
Android:windowSoftInputMode="adjustPan"/>
マニフェストアクティビティタグの内側に1行だけ書く
Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
そしてそれはうまくいくでしょう。
fun hideKeyboard(appCompatActivity: AppCompatActivity) {
val view = appCompatActivity.currentFocus
val imm = appCompatActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
baseActivityとBaseFragmentでアプリケーション全体に共通のメソッドを作成するだけです
onCreate()
でinitialize inputMethodManager
inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
キーボードの表示/非表示を切り替える
public void hideKeyBoard(View view) {
if (view != null) {
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
public void showKeyboard(View view, boolean isForceToShow) {
if (isForceToShow)
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
else if (view != null)
inputMethodManager.showSoftInput(view, 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);
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
/**
*
* Hide I Said!!!
*
*/
public static boolean hideSoftKeyboard(@NonNull Activity activity) {
View currentFocus = activity.getCurrentFocus();
if (currentFocus == null) {
currentFocus = activity.getWindow().getDecorView();
if (currentFocus != null) {
return getSoftInput(activity).hideSoftInputFromWindow(currentFocus.getWindowToken(), 0, null);
}
}
return false;
}
public static boolean hideSoftKeyboard(@NonNull Context context) {
if(Activity.class.isAssignableFrom(context.getClass())){
return hideSoftKeyboard((Activity)context);
}
return false;
}
public static InputMethodManager getSoftInput(@NonNull Context context) {
return (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
}
いくつかのコトリンコード:
アクティビティからキーボードを隠す:
(currentFocus ?: View(this))
.apply { (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow(windowToken, 0) }
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()
public void hideKeyboard()
{
if(getCurrentFocus()!=null)
{
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
public void showKeyboard(View mView) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
mView.requestFocus();
inputMethodManager.showSoftInput(mView, 0);
}
private void hideSoftKeyboard() {
View view = getView();
if (view != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
コトリンでこれを試してください
private fun hideKeyboard(){
val imm = activity!!.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(activity!!.currentFocus!!.windowToken, 0)
}
Javaでこれを試す
private void hideKeyboard(){
InputMethodManager imm =(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}