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