Cordova + Android - android-windowSoftInputMode adjustPan无效

时间:2015-11-07 17:02:08

标签: android cordova

我正在使用Cordova 5.4.0,我在config.xml

中有这个
<preference name="fullscreen" value="false" />
<preference name="android-windowSoftInputMode" value="adjustPan" />

但在构建之后,在我的AndroidManifest.xml中仍有

android:windowSoftInputMode="adjustResize"

为什么不起作用?我该如何解决?

6 个答案:

答案 0 :(得分:32)

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挂钩

将以下hook添加到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属性上执行正则表达式替换(仅首次出现)。

答案 1 :(得分:7)

我找到了一个使用edit-config标记的简单解决方案,该标记自v6.4.0开始构建在cordova中。我的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

答案 2 :(得分:0)

试试这个

  1. 的index.html

    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=device-height">
    
  2. config.xml中

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

答案 3 :(得分:0)

看起来您正在更改错误的AndroidManifest.xml。 在您的应用程序中,在\ platform \ android ...下,您将找到.xml文件,您必须更改该文件。

答案 4 :(得分:0)

您还可以使用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>

答案 5 :(得分:0)

我遇到了同样的问题,结果发现使用display: flex作为输入容器是一个问题。更改CSS,使容器不是基于flexbox的,为我解决了Android上的键盘/输入/滚动交互问题。