Android+PhoneGap: android:windowSoftInputMode не работает

Я разрабатываю приложение на основе PhoneGap и много гуглюл о том, как заставить мое веб-представление регулировать его высоту при появлении виртуальной клавиатуры или, по крайней мере, получить высоту виртуальной клавиатуры. Я нашел много сообщений (включая stackru), в которых говорится, что

android:windowSoftInputMode="adjustResize"

должен быть указан в манифесте, и я сделал это. Я также обнаружил, что для PhoneGap config.xml есть

<preference name="android-windowSoftInputMode" value="adjustResize"/>

установка, и я вставил это тоже. Я также попробовал комбинированное значение 'stateVisible| AdjustResize' (а не просто 'AdjustResize') для обоих параметров, но мне кажется, что они оба не имеют никакого эффекта. Не знаю, может я что-то не так делаю, но вы можете проверить скриншоты из эмулятора (Android 4.0.3, но я также пробовал 4.1.2 и 4.2.2):
http://screencast.com/t/Mm0mw8c693 - клавиатура видна
http://screencast.com/t/lZ2DomqeRR - клавиатура скрыта
На снимке экрана я намеренно запечатлел свои настройки манифеста и config.xml, так что вы можете увидеть, что они на самом деле там.
Я даже записал короткое видео - http://screencast.com/t/xI9PMcMJxxx

Как вы можете видеть, при отображении / скрытии клавиатуры не происходит изменения размеров области просмотра. Я также проверил window.innerHeight с помощью console.log(), и он остается одинаковым как для видимой, так и для скрытой клавиатуры.

Пожалуйста, дайте мне совет.

3 ответа

Решение

windowSoftInputMode="adjustResize" не работает, если ваше приложение находится в полноэкранном режиме (настройка fullscreen в true в config.xml). Это проблема Android, а не Cordova. выпуск CB-4404 хранился в баг-трекере Cordova в течение нескольких месяцев, но недавно выяснилось, что он работает так, как задумано для баг-трекера Android.

Я решил проблему, установив fullscreen в false поскольку для моего приложения не было проблемой не работать в полноэкранном режиме.

Я обнаружил, что мне нужно сделать 3 вещи, чтобы решить эту проблему и не допустить, чтобы actionBar скрывался, не прокручивался, когда поднималась программная клавиатура.

1) В AndroidManifest.xml в рассматриваемой деятельности мне была нужна строка:

android:windowSoftInputMode="adjustResize"

Первоначальная проблема заключается в том, что AdjustPan присутствовал в строке выше. Сначала, только изменение выше решило проблему.

Проект, в котором я работаю, использует фрагменты. В методе onCreateView другой фрагмент имеет строку:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

К сожалению, эта строка переопределяет параметр AdjustResize в манифесте приложения, и после того, как этот другой фрагмент был отображен, исправленный мною фрагмент снова сломался. Итак, чтобы исправить новый разрыв, я сделал 2 дополнительные вещи.

2) Я удалил строку SOFT_INPUT_ADJUST_PAN из метода onCreateView этого другого фрагмента, потому что эта строка в любом случае не нужна.

3) В методе onCreateView для фрагмента, который меня прежде всего интересует, я добавил строку:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

На самом деле, выполнение любого из пунктов 2 или 3 решит проблему. Я сделал оба, чтобы быть тщательным.

Либо вы можете явно установить это свойство в android.manifest на "AdjustNothing", тогда вам не нужно устанавливать "полноэкранный" режим на "ложь". но вы должны обновлять его каждый раз, когда обновляете / добавляете платформу Android.

Другие вопросы по тегам