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

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

 Zeeshan Mirza29 мая 2013 г., 07:16
но это спросили 2 года назад. Может быть, есть какое-то решение сейчас.
 Oli28 мая 2013 г., 11:51
аналогичный вопросВот :)

Ответы на вопрос(9)

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

https://github.com/Crysis21/KeyboardHeightProvider

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

У меня есть места во временном представлении с прозрачным фоном в нижней части экрана.я добавилandroid:windowSoftInputMode="adjustResize" флаг в теге активности в манифесте, как подсказывает @bill.

Теперь главная история вonGlobalLayout(), Там я вычисляю разницу между осью y временного обзора и высотой корневого обзора

final View view = findViewById(R.id.base);

view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        int rootViewHeight = view.getRootView().getHeight();
        View tv = findViewById(R.id.temp_view);
        int location[] = new int[2];
        tv.getLocationOnScreen(location);
        int height = (int) (location[1] + tv.getMeasuredHeight());
        deff = rootViewHeight - height;
        // deff is the height of soft keyboard

    }
});

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

 Gem17 дек. 2014 г., 06:56
Если мы используем флаг AdjustNothing, то при открытой клавиатуре представление не будет отображаться снова, поэтому, очевидно, onGlobalLayout не должен вызывать, и мы не сможем получить изменение в размере. Хотя я не пробовал сам, но это то, что ожидалось.
 VijayRaj05 дек. 2014 г., 07:47
Можно ли получить высоту клавиатуры с помощью?android:windowSoftInputMode="adjustNothing"

Не смотри больше! Я'Мы долго искали решение для этого. После нескольких дней пробных попыток, предложенных в SOF, я нашел идеальное решение, которое действительно работает.

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

Повеселись!

Я перепробовал много предложенных методов для этого, но ни один из них не работал на Android SDL. Я думаю, что это либо потому, что дисплей SDL "полноэкранный" или что он сидит внутриAbsoluteLayout» и, следовательно, высота "Посмотреть" никогда не меняется Этот метод работал для меня:

Получение размеров мягкой клавиатуры

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
    }
    });
 Ari27 нояб. 2015 г., 12:42
Это отличный ответ. @ Дэйв Лоуренс, ты должен упомянуть в ответе, что это Ректвысота непринять во внимание строку состояния.
 Sharm26 февр. 2017 г., 21:45
Безразлично»работать с "adjustNothing»
 rupps24 сент. 2017 г., 03:21
Боже мой! какой скрытый драгоценный камень янашел :)
 Alexey Yakovenko11 февр. 2015 г., 22:15
Спасибо за этот ответ, именно то, что мне было нужно. Это работает для расчета размера экранной клавиатуры без AdjustResize (который я нене хочу).
 Ali06 сент. 2017 г., 07:40
Как рассчитать высоту клавиатуры по этому методу?
 drakeet22 мая 2017 г., 11:51
Большой! Это работает для AdjustPan.
 Usman Rana12 дек. 2018 г., 14:42
В моем случае: int heightDiff = mRootView.getHeight () - r.bottom; работал нормально
Решение Вопроса

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

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

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

 htafoya27 февр. 2019 г., 20:22
Безразлично»не работает, если активность полноэкранная
 Jacky28 авг. 2013 г., 06:31
я думаю, что это работает, только когда Android: windowSoftInputMode = "adjustResize»
 Techfist16 дек. 2013 г., 11:35
его в пикселе ...
 Ali Shah Ahmed16 дек. 2013 г., 11:33
Это высота в пикселях или дп?
 zionpi26 мая 2016 г., 04:27
А такжеandroid:windowSoftInputMode="adjustResize"  следует положить в AndroidMainfest 's Атрибуция активности, где использовалась ваша программная клавиатура.
 Techfist09 дек. 2013 г., 08:04
Высота Diff даст вам, количество места клавиатуры занято.
 what is sleep06 дек. 2013 г., 20:50
это только получает, показана ли клавиатура, но это не 'т дать вам высоту клавиатуры.
 Thomas Keller01 дек. 2014 г., 12:36
150 пикселей недостаточно для устройств xxhdpi, таких как Nexus 5. Лучше преобразовать это абсолютное значение пикселя из значения dp и использовать его вместо этого. я использую120dp и это хорошо работает для Nexus 7 (xhdpi) и Nexus 5 (xxhdpi). Ваш опыт может отличаться, хотя ...
 NehaK17 февр. 2017 г., 07:32
Но если нам потребуетсяadjustNothing» тогда этот код можетбыть полезным ....

Я использовал это, чтобы получить программную высоту клавиатуры в 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;
                }
            });

Спасибо.

 htafoya27 февр. 2019 г., 20:32
Я использую тот же подход, но все же некоторые устройства, похоже, имеют проблемы. Один galaxy s9 с пользовательской клавиатурой, похоже, не справляется с этим.
 Adib Faramarzi11 мар. 2018 г., 15:29
Не забудьте удалитьOnGlobalLayoutListener внутри обратного вызова.

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

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

Siebe

 NehaK17 февр. 2017 г., 08:31
Это лучшее решение ..
 Sniper30 сент. 2018 г., 17:56
Этот код не работает на телефоне с надрезом, я получаю неправильную высоту ...
 010110010123 окт. 2018 г., 01:42
Я думал, что так долго работало нормально, но потом заметил, что на Chromebook в режиме планшета высота неправильная: '(
 neevek28 апр. 2019 г., 08:51
@Sniper, для телефона с надрезом можно попробоватьэтот.
 Maksim Ostrovidov10 сент. 2017 г., 08:41
Спасибо за решение. Было бы здорово, если бы вы сделали из этого lib.
 Fantasy Fang09 янв. 2019 г., 03:01
Отличная работа! Это может использовать в том, что windowSoftInputMode - это AdjustNothing.
 Kishore Jethava03 апр. 2017 г., 11:52
10+ идеальный братан!
 Marc Alexander26 апр. 2019 г., 23:03
Это спасатель.
 Siebe Brouwer01 сент. 2017 г., 07:42
Я рад, что смог помочь с этим. Приятно слышать, что это хорошо работает.
 Sough25 авг. 2017 г., 17:56
ЕДИНСТВЕННЫЙ рабочий раствор для настройки НИЧЕГО!
 vijay01 июл. 2017 г., 15:23
Есть ли в этом проекте зависимость от gradle или jar?

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

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

(копия моего ответа на аналогичный вопрос,Получение размеров мягкой клавиатуры) Я

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

android:layout_alignParentBottom="true"

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

android:windowSoftInputMode="adjustResize"

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

 pesho04 февр. 2016 г., 10:19
@ Ло-Тан, это именно то, чего я хочу достичь. Вы выяснили, как это сделать?
 Lo-Tan17 мая 2015 г., 22:38
У меня есть просмотр видео в полноэкранном режиме, который я НЕ хочу перемещать при изменении размера макета, но я все еще хочу, чтобы текстовое поле перемещалось и оставалось над клавиатурой. Как можно это сделать?

Ваш ответ на вопрос