Надежно скрывать программную панель - программирование
Подтвердить что ты не робот

Надежно скрывать программную панель

У меня есть приложение, и вам нужно закрыть программную клавиатуру на довольно большом количестве действий. Например, при нажатии кнопки, когда новый макет рисуется, при изменении ориентации экрана, когда контроллер сообщает 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: Я пробовал много способов скрытия программных клавиш, но никто из них, похоже, не работает надежно. Есть ли способ надежного скрытия мягкой клавиатуры?

4b9b3361

Ответ 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);

Не нужно беспокоиться и о нулевом указателе.