Кордова + 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 для меня.