web-dev-qa-db-ja.com

Androidソフトキーボードの表示/非表示イベントの検出

PhonegapでshowKeyboardイベントとhidekeyboardイベントを検出しようとしています。そのために、devicereadyイベントに次のコードを配置しました。

  bindEvents: function() {
    document.addEventListener('deviceready', this.onDeviceReady, false);
},
// deviceready Event Handler
//
// The scope of 'this' is the event. In order to call the 'receivedEvent'
// function, we must explicity call 'app.receivedEvent(...);'
onDeviceReady: function() {
    document.addEventListener("menubutton",app.onMenuKeyPress,false);
    document.addEventListener("backbutton",navigateBack,false);
    document.addEventListener("hidekeyboard", onKeyboardHide, false);
    document.addEventListener("showkeyboard", onKeyboardShow, false);
},

ここでは、バックボタンイベントが発生し、正常に機能していますが、hidekeyboardおよびshowkeyboardイベントは発生しません。

また、それを検出するために、ブラウザで機能するwindow.onresizeイベントを使用しようとしました。そのコードは次のとおりです。

window.onresize = function(){
    var screenHeight = $(window).height();
    alert(screenHeight);
    var diff = screenInitialHeight - screenHeight;
    var newHeight = screenInitialHeight-diff;
    alert(newHeight);
    $('#mainpage').height(newHeight);
    $('#nav_container').height(newHeight);
}

しかし、このコードは、キーボードの表示または非表示でも実行されませんでした。この機能は、初めてアプリを実行するときにのみ実行されます。が開始されます。一部の場所でこれらのイベントが機能しているのを見たので、おそらくいくつかの構成ファイルなどに、私の側から何か問題があると思います。したがって、以下はandroidmanifest.xmlコードです。

    <?xml version='1.0' encoding='utf-8'?>
<manifest Android:hardwareAccelerated="true" Android:versionCode="1" Android:versionName="1.0.0" Android:windowSoftInputMode="adjustPan" package="com.phonegap.move_custom" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <supports-screens Android:anyDensity="true" Android:largeScreens="true" Android:normalScreens="true" Android:resizeable="true" Android:smallScreens="true" Android:xlargeScreens="true" />
    <uses-permission Android:name="Android.permission.INTERNET" />
    <application Android:debuggable="true" Android:hardwareAccelerated="true" Android:icon="@drawable/icon" Android:label="@string/app_name" Android:largeHeap="true">
        <activity Android:configChanges="keyboardHidden|keyboard|screenSize|locale" Android:label="@string/app_name" Android:name="move_custom" Android:screenOrientation="portrait" Android:theme="@Android:style/Theme.Black.NoTitleBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-feature Android:name="Android.hardware.camera" Android:required="false" />
    <uses-sdk Android:minSdkVersion="10" Android:targetSdkVersion="17" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.RECORD_AUDIO" />
    <uses-permission Android:name="Android.permission.RECORD_VIDEO" />
    <uses-permission Android:name="Android.permission.CAMERA" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-feature Android:name="Android.hardware.camera" />
    <uses-feature Android:name="Android.hardware.camera.autofocus" />
</manifest>

何か問題があれば教えてください。また、これらのイベントが誰かのアプリで機能している場合は、アプリを共有してください。構成とコードを確認して、アプリで機能しない理由を確認できるようにします。すべての良い努力に感謝します。私はすでに近くにいますが、何かが足りないようです。だからあなたが言うことができることはおそらく役に立つでしょう。

    @Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    if (getResources().getConfiguration().orientation == 2) {
        super.setIntegerProperty("splashscreen", R.drawable.splash);
    }
    else {
        super.setIntegerProperty("splashscreen", R.drawable.splashportrait);
    }

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    super.loadUrl(Config.getStartUrl(), 3000);
}
14
Hafiz

どうやらshowkeyboard/hidekeyboardイベントは発生しませんアプリを実行しているときフルスクリーンモードで(例:ステータスバーなし)キーボードがポップアップしても画面サイズは変わらないためです。
https://issues.Apache.org/jira/browse/CB-392

アプリをフルスクリーンで実行したくない場合:

最初にこれを試して、問題がイベントの発生に絞り込まれるのか、イベントの発生時に呼び出そうとする関数に絞り込まれるのかを見てみましょう。

function onDeviceReady() {
    alert("Device Ready");
    document.addEventListener("showkeyboard", function(){ alert("Keyboard is ON");}, false);
    document.addEventListener("hidekeyboard", function(){ alert("Keyboard is OFF");}, false);
}

私はこれをAndroid 4.2と4.3の両方で正常に動作しました。

注意:

フルスクリーンをオフにするには:
AndroidManifest.xmlからNoTitleBarを削除します。

Android:theme="@Android:style/Theme.Black.NoTitleBar

および/またはこれらの行をMainActivity.JavaonCreateメソッドに追加します。

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
15
benka

ionic-plugin-keyboard を使用して、イベントnative.keyboardshowおよびnative.keyboardhideフルスクリーン/イマーシブモードでも起動されます:

コード例:

document.addEventListener('deviceready', 
  function(){
    // disable immersive mode  on Android when keyboard is shown
        try {
      if (cordova.platformId == 'Android') {
        AndroidFullScreen.immersiveMode(false, false);
        window.addEventListener('native.keyboardshow', function (e) {
          AndroidFullScreen.showSystemUI(false, false);

        });
        window.addEventListener('native.keyboardhide', function (e) {
          AndroidFullScreen.immersiveMode(false, false);
        });
      }
    } catch (error) {
      console.log('deviceready - ' + error);
    }
}, false);
0
Stéphane