web-dev-qa-db-fra.com

détecter les touches Android afficher/masquer les événements

J'essaie de détecter les événements showKeyboard et hidekeyboard sur phonegap. Pour cela, lors de l'événement deviceready, j'ai placé le code suivant:

  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);
},

Ici, l'événement backbutton est déclenché et fonctionne correctement, mais les événements hidekeyboard et showkeyboard ne sont jamais déclenchés.

Également pour le détecter, j'ai essayé d'utiliser l'événement window.onresize, qui a fonctionné dans le navigateur. Voici son code:

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);
}

Mais ce code n'a pas non plus été exécuté lors de l'affichage ou du masquage du clavier. Cette fonction ne s'exécute que lors de la première application. a démarré. J'ai vu à certains endroits que ces événements fonctionnent pour certaines personnes, alors je pense qu'il y a quelque chose qui cloche de mon côté, probablement dans un fichier de configuration e.t.c. Voici donc le code 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>

S'il vous plaît laissez-moi savoir si quelque chose doit être chagned. De plus, si ces événements fonctionnent dans l'application d'un utilisateur, partagez-le s'il vous plaît. afin que je puisse essayer de vérifier la configuration et le code qui explique pourquoi cela ne fonctionne pas dans mon application. Tous les bons efforts seront appréciés. On dirait que je suis déjà près mais manque quelque chose. Donc, tout ce que vous pourrez dire sera probablement utile.

    @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);
}
13
Hafiz

Apparemment, showkeyboard/hidekeyboard les événements NE se déclenchent PAS lorsque vous exécutez votre application en mode plein écran (par exemple, aucune barre d'état en haut), car la taille de l'écran ne change pas quand le clavier apparaît.
https://issues.Apache.org/jira/browse/CB-392

Si vous ne souhaitez pas que votre application s'exécute en plein écran:

Essayez ceci en premier. Voyons s’il réduit votre problème au déclenchement de l’événement ou à la fonction qu’il essaie d’appeler lors du déclenchement de l’événement.

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

J'ai testé cela sur Android 4.2 et 4.3 a bien fonctionné sur les deux.

Remarque:

Pour désactiver le mode plein écran:
Supprimer NoTitleBar de votre AndroidManifest.xml:

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

et/ou ajoutez ces lignes à la méthode onCreate dans votre MainActivity.Java :

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

Avec ionic-plugin-keyboard , les événements native.keyboardshow et native.keyboardhide sont déclenchés, même en mode plein écran/immersif:

Exemple de code:

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