Кордова + Android - андроид-окноSoftInputMode adjustPan не работает
Я использую Cordova 5.4.0, и у меня есть это в моем config.xml
:
<preference name="fullscreen" value="false" />
<preference name="android-windowSoftInputMode" value="adjustPan" />
но после построения в моем AndroidManifest.xml
все еще есть
android:windowSoftInputMode="adjustResize"
Почему он не работает? И как я могу его решить?
Ответы
Ответ 1
android-windowSoftInputMode
предпочтение android-windowSoftInputMode
поддерживается только Phonegap, а не Cordova.
Обходной путь 1 (Cordova 6. 4+): используйте edit-config
Убедитесь, что атрибут пространства имен xmlns:android="http://schemas.android.com/apk/res/android"
включен в элемент widget
и добавьте элемент edit-config:
<widget xmlns:android="http://schemas.android.com/apk/res/android" ...>
...
<edit-config file="AndroidManifest.xml" target="/manifest/application/activity[@android:name='MainActivity']" mode="merge">
<activity android:windowSoftInputMode="adjustPan" />
</edit-config>
...
</widget>
Обходной путь 2 (до Cordova 6.4): используйте плагин
Добавьте плагин cordova-custom-config:
cordova plugin add cordova-custom-config
Добавьте следующее предпочтение:
<platform name="android">
<preference name="android-manifest/application/activity/@android:windowSoftInputMode" value="adjustPan" />
...
</platform>
Обходной путь 3: добавьте хук before_build
Добавьте следующий хук в config.xml:
<hook type="before_build" src="scripts/appBeforeBuild.js" />
Добавьте файл appBeforeBuild.js в каталог scripts со следующим содержимым:
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var pathToManifest = path.join(__dirname, '../platforms/android', 'AndroidManifest.xml');
if(fs.existsSync(pathToManifest)) {
var config = fs.readFileSync(pathToManifest, 'utf8');
var result = config.replace(/(android:windowSoftInputMode=").*?(")/, '$1adjustPan$2');
fs.writeFileSync(pathToManifest, result, 'utf8');
console.log('Set android:windowSoftInputMode to adjustPan');
}
else {
console.log('Could not find AndroidManifest to set android:windowSoftInputMode');
}
Этот сценарий будет использовать Node для поиска AndroidManifest и замены регулярного выражения в android:windowSoftInputMode
(только для первого появления).
Ответ 2
Я нашел простое решение, используя тег edit-config
который встроен в cordova начиная с v6.4.0. Мой config.xml
теперь выглядит так, и клавиатура больше не изменяет размер области просмотра!
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.hello" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>HelloWorld</name>
<!-- ... -->
<edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application/activity[@android:name='MainActivity']">
<activity android:name="MainActivity" android:windowSoftInputMode="adjustPan" />
</edit-config>
<!-- ... -->
</widget>
Подсказка: когда я экспериментировал, чтобы это работало, я сделал несколько случайных изменений в своем AndroidManifest.xml
. Вы можете легко сбросить эту настройку, удалив и повторно добавив платформу Android в ваш проект Cordova следующим образом: cordova platform rm android && cordova platform add android
.
Ответ 3
Попробуйте этот
-
Index.html
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=device-height">
-
config.xml
<preference name="android-windowSoftInputMode" value="adjustResize|adjustPan" />
Ответ 4
Похоже, вы меняете неправильный AndroidManifest.xml.
В вашем приложении под \platform\android... вы найдете файл .xml, вы должны изменить его.
Ответ 5
Вы также можете использовать cordova-custom-config
cordova plugin add cordova-custom-config
и добавьте это в свой config.xml
<platform name="android">
<preference name="android-manifest/application/activity/@android:windowSoftInputMode" value="adjustPan" />
</platform>
Ответ 6
У меня была та же самая проблема, и это оказалось проблемой с использованием display: flex
для контейнера входных данных. Изменение CSS так, чтобы контейнер не был основан на flexbox, решило проблему взаимодействия клавиатуры/ввода/прокрутки на Android для меня.