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.