Cordova 5.4.0を使用していますが、これをconfig.xml
:
<preference name="fullscreen" value="false" />
<preference name="Android-windowSoftInputMode" value="adjustPan" />
しかし、ビルド後、私のAndroidManifest.xml
まだあります
Android:windowSoftInputMode="adjustResize"
なぜ機能しないのですか?そして、どうすればそれを解決できますか?
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ファイルを次の内容でスクリプトディレクトリに追加します。
#!/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
属性(最初の出現のみ)。
V6.4.0以降、cordovaに組み込まれている edit-config
タグを使用した簡単な解決策を見つけました。私の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
のように削除して再追加します。
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>
これをお試しください
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" />
私は同じ問題を抱えていましたが、入力のコンテナーにdisplay: flex
を使用することには問題があることがわかりました。コンテナがflexboxに基づいていないようにCSSを変更すると、Android.
間違ったAndroidManifest.xmlを変更しているようです。アプリケーションの\ platform\Android ...の下に.xmlファイルがあります。これを変更する必要があります。