Есть ли способ в Android, чтобы получить высоту виртуальной клавиатуры устройства

Есть ли способ в Android, чтобы получить высоту виртуальной клавиатуры, отображаемой на устройстве во время выполнения? На самом деле я хочу показать текстовое поле над клавиатурой.

Комментарии к вопросу (3)

Чтобы решить эту я написал keyboardHeightProvider, который может рассчитать высоту плавающего мягкая клавиатура. Активность может быть установлен в adjustNone или adjustPan в AndroidManifest.xml.

https://github.com/siebeprojects/samples-keyboardheight

Зибе

Комментарии (12)

Я перепробовал много предложенных методов для этого, но никто, казалось, работали для СДЛ Андроид. Я думаю, что это либо потому, что дисплей СДЛ есть "Полный&quot как экран; или что он сидит в "и AbsoluteLayout" и поэтому высота от "Вид" и никогда не меняется. Этот метод работал для меня:

https://stackoverflow.com/questions/13534365/getting-the-dimensions-of-the-soft-keyboard

mRootWindow = getWindow();
mRootView = mRootWindow.getDecorView().findViewById(android.R.id.content);
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout(){
        Rect r = new Rect();
        View view = mRootWindow.getDecorView();
        view.getWindowVisibleDisplayFrame(r);
        // r.left, r.top, r.right, r.bottom
    }
    });
Комментарии (7)
Решение

Да можно, с помощью Viewtree наблюдателя и глобального слушателя макет, попробуйте указанные ниже действия

  1. Получить корневой вид вашего макета
  2. получить Viewtree наблюдателя за этот корень, и добавить глобальный слушатель макет на вершине этого.

теперь всякий раз, когда экранная клавиатура отображается андроид изменить размер вашего экрана, и вы получите звонок на ваш слушатель. Что'ы это единственное, что вам сейчас нужно сделать-это рассчитать разницу между высотой вашего корневого мнение после повторного размера и первоначального размера. Если разница составляет более 150 рассматривайте это как клавиатура была завышена.

Ниже приведен пример кода

root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
     public void onGlobalLayout(){
           int heightDiff = root.getRootView().getHeight()- root.getHeight();
           // IF height diff is more then 150, consider keyboard as visible.  
        }
  });

С уважением, Techfist

Комментарии (10)

поместите текстовое поле в родительском дне.

android:layout_alignParentBottom="true"

и в файле манифеста сделать adjustresize мягкий ввод ``

android:windowSoftInputMode="adjustResize"

тогда текстовое поле будет двигаться вверх, когда клавиатура появляется.

Комментарии (2)

Вы можете'т сказать. Нет, правда: вы просто можете'т сказать.

Клавиатура не нуждается в какой-либо конкретной формы. Это не должны быть помещены в нижней части экрана (много из популярные параметры не), он не должен держать его текущего размера при изменении текстовых полей (почти никто в зависимости от флагов). Он даже не должны быть прямоугольный. Он может также просто принять за весь экран.

(копия моего ответа на подобный вопрос, https://stackoverflow.com/questions/13534365/getting-the-dimensions-of-the-soft-keyboard )

Комментарии (0)

Я'вэ создал проект библиотеки получить высоту клавиатуры для Android, даже если деятельность не'т использовать adjustResize` режим ввода.

https://github.com/Crysis21/KeyboardHeightProvider

Комментарии (0)

Мое решение-сочетание всех вышеуказанных решений. Это решение тоже суховато, но решить проблему (по крайней мере для меня).

  1. У меня есть места на временной вид с прозрачным фоном в нижней части экрана.
  2. Я добавил `андроид:windowSoftInputMode="в adjustResize" и флаг в теге Activity в манифесте как @законопроекта предполагает.
  3. Сейчас основная история в onGlobalLayout()`. Там я вычислить разницу между осью Y темп просмотра и высота корня вид

окончательный вид = команду findViewById(Р. ИД.базы);

вид.getViewTreeObserver().addOnGlobalLayoutListener(новый OnGlobalLayoutListener() {

@Переопределить onGlobalLayout общественного недействительными() {

инт rootViewHeight = вид.getRootView().getHeight(); Смотреть ТВ = команду findViewById(Р. ИД.temp_view); положение int[] = новый тип int[2]; ТВ.getLocationOnScreen(местоположение); int высота = (тип int) (локация[1] + телевизор.getMeasuredHeight()); дефф = rootViewHeight - высота; // дефф-высота мягкая клавиатура

} });

Но в любом случае, чтобы решить проблему @zeeshan0026 только один флаг в манифесте андроид:windowSoftInputMode="и adjustResize" в достаточно.

Комментарии (2)

Смотрите не больше! Я'вэ искал решение для этого в течение длительного времени. После нескольких дней попыток все трюки предложил на СОФ, я нашел идеальное решение, которое действительно работает.

Этот проект GitHub демонстрирует это наилучшим образом: https://github.com/siebeprojects/samples-keyboardheight

Получайте удовольствие!

Комментарии (0)

Я использовал это, чтобы получить высоту клавиатуры программно в Android и протестировали его, пожалуйста, попробуйте еще это:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                    //boolean visible = heightDiff > screenHeight / 3;
                }
            });

Спасибо.

Комментарии (2)

Этот метод работает с adjustNothing или любой windowSoftInputMode на вашу деятельность.

С помощью PopupWindow, вы можете иметь отдельные "и поведение клавиатуры" и для него, и он сообщит вам, что размер клавиатуры. В PopupWindow имеет высоту экрана, а ширину 0px, так что вы выиграли'т вижу, он выиграл'т повлиять на вашу деятельность, но и предоставим вам необходимую информацию.

Создайте класс, называемый KeyboardHeightProvider и добавьте следующий код:

public class KeyboardHeightProvider extends PopupWindow {
    public KeyboardHeightProvider(Context context, WindowManager windowManager, View parentView, KeyboardHeightListener listener) {
        super(context);

        LinearLayout popupView = new LinearLayout(context);
        popupView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        popupView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            DisplayMetrics metrics = new DisplayMetrics();
            windowManager.getDefaultDisplay().getMetrics(metrics);

            Rect rect = new Rect();
            popupView.getWindowVisibleDisplayFrame(rect);

            int keyboardHeight = metrics.heightPixels - (rect.bottom - rect.top);
            int resourceID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceID > 0) {
                keyboardHeight -= context.getResources().getDimensionPixelSize(resourceID);
            }
            if (keyboardHeight < 100) {
                keyboardHeight = 0;
            }
            boolean isLandscape = metrics.widthPixels > metrics.heightPixels;
            boolean keyboardOpen = keyboardHeight > 0;
            if (listener != null) {
                listener.onKeyboardHeightChanged(keyboardHeight, keyboardOpen, isLandscape);
            }
        });

        setContentView(popupView);

        setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
        setWidth(0);
        setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
        setBackgroundDrawable(new ColorDrawable(0));

        parentView.post(() -> showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0));
    }

    public interface KeyboardHeightListener {
        void onKeyboardHeightChanged(int keyboardHeight, boolean keyboardOpen, boolean isLandscape);
    }
}

Обратите внимание, как PopupWindow имеет свой собственный setSoftInputMode (...), так что он не&#39;т важно, что вы установить в вашей деятельности, в PopupWindow еще долго будет сказываться на клавиатуре, открывая или закрывая и обеспечит родительской активности высоту. Если высота в>= 100` можно считать открытой клавиатуре.

Чтобы его использовать, просто инстанцировать его в вашей деятельности'метод onCreate ы (...) метод после setContentView(...)`:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    LinearLayout llRoot = findViewById(R.id.llRoot); //The root layout (Linear, Relative, Contraint, etc...)

    new KeyboardHeightProvider(this, getWindowManager(), llRoot, new KeyboardHeightProvider.KeyboardHeightListener() {
        @Override
        public void onKeyboardHeightChanged(int keyboardHeight, boolean keyboardOpen, boolean isLandscape) {
            Log.i("keyboard listener", "keyboardHeight: " + keyboardHeight + " keyboardOpen: " + keyboardOpen + " isLandscape: " + isLandscape);

            //Do what you want or have to with the parameters..
        }
    });

    //...
}
Комментарии (0)