Как проверить видимость программной клавиатуры в Android? - PullRequest
485 голосов
/ 27 января 2010

Мне нужно сделать очень простую вещь - выяснить, отображается ли программная клавиатура. Возможно ли это в Android?

Ответы [ 38 ]

1 голос
/ 16 апреля 2015

вы можете попробовать это, отлично работает для меня:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

if (imm.isAcceptingText()) {
    //Software Keyboard was shown..
} else {
    //Software Keyboard was not shown..
}
0 голосов
/ 23 июня 2015

Это решение может снова открыть клавиатуру, но оно работает.

InputMethodManager inputManager = ( (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE) );

private boolean isKeyboardShowing() {

    boolean isKeyboardShowing = inputManager.hideSoftInputFromWindow(irrelevantView.getWindowToken(), 0);
    if (isKeyboardShowing) {
        inputManager.showSoftInput(this.getCurrentFocus(), 0);
    }
    return isKeyboardShowing;
}
0 голосов
/ 15 октября 2014

Не делайте никакого жесткого кода. Лучший способ - изменить размеры своих представлений во время работы над Get Focus на EditText с помощью KeyBord Show. Вы можете сделать это, добавив свойство resize для активности в файл манифеста, используя следующий код.

android:windowSoftInputMode="adjustResize"

0 голосов
/ 01 июня 2016

Вот обходной путь, чтобы узнать, видна ли программная клавиша.

  1. Проверка работоспособности служб в системе с помощью ActivityManager.getRunningServices (max_count_of_services);
  2. В возвращенных экземплярах ActivityManager.RunningServiceInfo проверьте значение clientCount для службы программной клавиатуры.
  3. Вышеупомянутый clientCount будет увеличиваться каждый раз, когда отображается программная клавиатура. Например, если clientCount был Первоначально 1, когда клавиатура отображается, будет 2.
  4. При отклонении клавиатуры значение clientCount уменьшается. В этом случае он сбрасывается до 1.

Некоторые популярные клавиатуры имеют определенные ключевые слова в своих именах классов:

Google AOSP = IME
Swype = IME
Swiftkey = KeyboardService
Fleksy = keyboard
Adaptxt = IME (KPTAdaptxtIME)
Smart = Keyboard (SmartKeyboard)

Из ActivityManager.RunningServiceInfo проверьте наличие вышеуказанных шаблонов в ClassNames. Кроме того, ActivityManager.RunningServiceInfo clientPackage = android, указывающий, что клавиатура привязана к системе.

Вышеупомянутая информация может быть объединена для строгого определения, видна ли программная клавиатура.

0 голосов
/ 11 марта 2016

Решение, предоставленное Reuben Scratton и Kachi, похоже, основывается на плотности пикселей устройств, если у вас устройство с высокой плотностью, разница в высоте может быть больше 100, даже если клавиатура опущена. Немного поработаем, чтобы увидеть начальную разницу высот (с клавиатурой вниз), а затем сравнить с текущей разницей.

boolean isOpened = false;
int firstHeightDiff = -1;

public void setListenerToRootView(){
    final View activityRootView = getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
    Rect r = new Rect();
    activityRootView.getWindowVisibleDisplayFrame(r);
    firstHeightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (isAdded()) {
                Rect r = new Rect();
                activityRootView.getWindowVisibleDisplayFrame(r);
                int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
                isOpened = heightDiff>firstHeightDiff+100;
                if (isAdded())
                    if(isOpened) {
                        //TODO stuff for when it is up
                    } else {
                        //TODO stuf for when it is down
                    }
            }
        }
    });
}
0 голосов
/ 15 января 2016

Подумайте, есть простой способ, как это:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.isActive();

Вы также можете увидеть, активен ли он в определенном представлении:

imm.isActive(View v);
0 голосов
/ 30 сентября 2015

Я знаю, как точно вы можете определить, скрыта клавиатура или нет.

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

public int getNavigationBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

public boolean isKeyboardHidden() {
    int delta = mRootView.getRootView().getHeight() - mRootView.getHeight() - getNavigationBarHeight() - getStatusBarHeight()
            - getSupportActionBar().getHeight();
    return delta <= 0;
}

Это работает для планшетов. Когда панель навигации отображается горизонтально.

0 голосов
/ 11 августа 2015
if (keyopen())
{
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);            
}

Приведенная выше функция используется для проверки видимости клавиатуры. Если это так, то я закрываю его.

Ниже показаны два необходимых метода.

Сначала определите работоспособную высоту окна в onCreate.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//  add to onCreate method
    Rect rectgle= new Rect();
    Window window= getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
    sheight= rectgle.bottom;
//

} 

Затем добавьте логический метод, который получает высоту окна в этом экземпляре. Если он не соответствует оригиналу (при условии, что вы не меняете его по пути ...), клавиатура открыта.

public boolean keyopen()
{
    Rect rectgle= new Rect();
    Window window= getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
    int curheight= rectgle.bottom;

    if (curheight!=sheight)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Frotz!

0 голосов
/ 20 июля 2015

Я знаю, что это старый пост, но я думаю, что это самый простой из известных мне подходов, и моим тестовым устройством является Nexus 5. Я не пробовал его на других устройствах. Надеюсь, что другие поделятся своим подходом, если они найдут мой код нехорошим:)

public static boolean isKeyboardShown(Context context, View view) {
        if (context == null || view == null) {
            return false;
        }
        InputMethodManager imm = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        return imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
}

imm.hideSoftInputFromWindow возвращает логическое значение.

Спасибо

0 голосов
/ 26 мая 2015

Метод, который не нуждается в LayoutListener

В моем случае я хотел бы сохранить состояние клавиатуры перед заменой моего фрагмента. Я вызываю метод hideSoftInputFromWindow из onSaveInstanceState, который закрывает клавиатуру и возвращает меня, была ли клавиатура видимой или нет.

Этот метод прост, но может изменить состояние вашей клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...