Надежно скрывать программную панель
У меня есть приложение, и вам нужно закрыть программную клавиатуру на довольно большом количестве действий. Например, при нажатии кнопки, когда новый макет рисуется, при изменении ориентации экрана, когда контроллер сообщает strong > пользовательский интерфейс, и т.д.
Я использую optionsMenuButton, чтобы перевернуть представление с помощью ViewFlipper, и, очевидно, я хочу, чтобы клавиатура скрывалась в перевернутом виде (там нет поля ввода).
Я пробовал это до сих пор и говорю, почему они ненадежны:
Это не сработало, потому что у меня много editTexts и другие представления. Мне нужен более общий, тот, который не требует представления как аргумента, если это возможно.
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Для меня это вообще не работает:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Это работает, но сразу же снова появляется клавиатура при просмотре представления.
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Это работает иногда, но getCurrentFocus() возвращает null большую часть времени.
InputMethodManager inputManager = (InputMethodManager)
Context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
Этот режим работает только при отображении клавиатуры:
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
Это не работает с EditText, как первый фрагмент кода, но с корневым макетом, который изменяется при изменении ориентации и каждый раз, когда вызывается oncreate. У меня есть другой формат XML для пейзажа/портрета и обычного/большого. Все корневые макеты имеют идентификатор root
. Это работает в первый раз, но после этого он больше не работает.
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Bottomline: Я пробовал много способов скрытия программных клавиш, но никто из них, похоже, не работает надежно. Есть ли способ надежного скрытия мягкой клавиатуры?
Ответы
Ответ 1
Поскольку вам нужно EditText
, чтобы открыть клавиатуру, найдите конкретную и используйте первый метод, который вы отображали, чтобы скрыть клавиатуру:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Однако вам понадобится EditText
. Во-первых, получите все виды:
public static ArrayList<View> getAllViewsFromRoots(View...roots) {
ArrayList<View> result = new ArrayList<View>();
for (View root : roots) {
getAllViews(result, root);
}
return result;
}
private static void getAllViews(ArrayList<View> allviews, View parent) {
allviews.add(parent);
if (parent instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup)parent;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
getAllViews(allviews, viewGroup.getChildAt(i));
}
}
}
Затем получим вид EditText
.
public static EditText getEditText(View root) {
ArrayList<View> views = getAllViewsFromRoots(root);
for (View view : views) {
if (view instanceof EditText && view.getVisibility() == View.VISIBLE) {
return (EditText) view;
}
}
return null;
}
Позвонить где-нибудь:
Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0));
с этим вызовите метод укрытия.
Ответ 2
Я думаю, что если вы справитесь с нулевым случаем getCurrentFocus(), вам хорошо идти. Я использую метод ниже, и он работает как шарм!
/* Hide Keyboard */
public static void hideKeyboard(Activity activity){
InputMethodManager inputMethodManager = (InputMethodManager)activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
View focus = activity.getCurrentFocus();
if(focus != null)
inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
Ответ 3
Это работает для меня всегда:
InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Ответ 4
Только это решение работало для меня:
mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
У меня было диалоговое окно с полем ввода, скрытие которого не скрывало клавиатуру на планшете.
Ответ 5
Это должно работать в большинстве случаев.
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0);
Не нужно беспокоиться и о нулевом указателе.