HideSoftInputFromWindow не работает?

Для некоторых представлений EditText я хочу использовать пользовательскую клавиатуру вместо мягкой .

Проблема в том, что при первом нажатии на EditText отображаются обе клавиатуры. Когда я нажимаю второй раз – мягкая клавиатура, наконец, исчезает.

Что может быть причиной такого поведения?

Вот код, который я использую:

 package pkleczek.profiwan.keyboards; import android.app.Activity; import android.inputmethodservice.KeyboardView; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; public abstract class CustomKeyboard { /** A link to the KeyboardView that is used to render this CustomKeyboard. */ protected KeyboardView mKeyboardView; /** A link to the activity that hosts the {@link #mKeyboardView}. */ protected Activity mHostActivity; /** Returns whether the CustomKeyboard is visible. */ public boolean isCustomKeyboardVisible() { return mKeyboardView.getVisibility() == View.VISIBLE; } /** * Make the CustomKeyboard visible, and hide the system keyboard for view v. */ public void showCustomKeyboard(View v) { mKeyboardView.setVisibility(View.VISIBLE); mKeyboardView.setEnabled(true); if (v != null) { InputMethodManager inputManager = (InputMethodManager) mHostActivity .getSystemService(Activity.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); } } /** Make the CustomKeyboard invisible. */ public void hideCustomKeyboard() { mKeyboardView.setVisibility(View.GONE); mKeyboardView.setEnabled(false); } /** * Register <var>EditText<var> with resource id <var>resid</var> (on the * hosting activity) for using this custom keyboard. * * @param resid * The resource id of the EditText that registers to the custom * keyboard. */ public void registerEditText(int resid) { EditText edittext = (EditText) mHostActivity.findViewById(resid); edittext.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { showCustomKeyboard(v); } else { hideCustomKeyboard(); } } }); edittext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showCustomKeyboard(v); } }); edittext.setInputType(edittext.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); } } 

Попробуйте поставить следующее условие в свой код inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); перед inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); линия:

  if (inputManager!=null) { Activity activity = getActivity(); if (acvivity == null) return; if (activity.getCurrentFocus() == null) return; if (activity.getCurrentFocus().getWindowToken() == null) return; inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } 

Я использовал его в ListFragment, чтобы скрыть клавиатуру по умолчанию. Сначала, когда я нажимаю EditText, и отображается клавиатура, а когда onScrollStateChanged, я скрываю ее.

Вы также можете попытаться поместить код InputMethodManager внутри onClickListener в EditText, а затем вызвать метод showCustomKeyboard () .

Поместите оператор Else и войдите в него после if (v != null) , возможно, ваш View v имеет значение NULL .

Решение, предоставленное Rotemmiz в теме Close / hide, Soft Soft для Android работало для меня.

Резюме:

 public void setEditTextFocus(EditText editText, boolean isFocused) { editText.setCursorVisible(isFocused); editText.setFocusable(isFocused); editText.setFocusableInTouchMode(isFocused); if (isFocused) { editText.requestFocus(); } }