web-dev-qa-db-ja.com

Cordova + Android-Android-windowSoftInputMode adjustPanが機能しない

Cordova 5.4.0を使用していますが、これをconfig.xml

<preference name="fullscreen" value="false" />
<preference name="Android-windowSoftInputMode" value="adjustPan" />

しかし、ビルド後、私のAndroidManifest.xmlまだあります

Android:windowSoftInputMode="adjustResize"

なぜ機能しないのですか?そして、どうすればそれを解決できますか?

24
Frank

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属性(最初の出現のみ)。

35
Philip Bijker

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のように削除して再追加します。

8
tillsanders

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>
0
David Boho

これをお試しください

  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" />
    
0
Gajanan

私は同じ問題を抱えていましたが、入力のコンテナーにdisplay: flexを使用することには問題があることがわかりました。コンテナがflexboxに基づいていないようにCSSを変更すると、Android.

0
Chris Edgington

間違ったAndroidManifest.xmlを変更しているようです。アプリケーションの\ platform\Android ...の下に.xmlファイルがあります。これを変更する必要があります。

0
akunamatata