Показ/скрыть события

Я пытаюсь обнаружить showKeyboard и hidekeyboard events на телефоне. Для этой цели, по событию 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);
}

Но этот код также не выполнялся при показе или скрытии клавиатуры. Эта функция выполняется только при первом приложении. запускается. Я видел в некоторых местах, что для некоторых людей эти события работают, поэтому я думаю, что с моей стороны что-то не так, вероятно, в каком-то файле конфигурации e.t.c. Итак, следующий код 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);
}

Ответ 1

По-видимому, 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, работал отлично на обоих.

Примечание:

Чтобы отключить полноэкранный режим:
Удалите NoTitleBar из AndroidManifest.xml:

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

И/или добавьте эти строки в метод onCreate в MainActivity.java:

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

Ответ 2

Используя 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);