检测android软键盘显示/隐藏事件

Haf*_*fiz 13 javascript-events android-softkeyboard android-event cordova cordova-3

我试图在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);
},
Run Code Online (Sandbox Code Playgroud)

这里后退按钮事件被解雇和罚款,但工作hidekeyboardshowkeyboard事件从未被触发.

为了检测它,我尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码也没有在show或hide键盘上执行.此功能仅在首次应用时执行.开始了.我在某些地方看到,对于某些人来说这些事件正在发挥作用,所以我觉得我身边有一些问题,可能是在一些配置文件等等.所以下面是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>
Run Code Online (Sandbox Code Playgroud)

如果有什么需要被谴责,请告诉我.此外,如果这些事件在某人的应用程序中运行,请分享您的应用程序.这样我就可以尝试检查配置和代码,说明它在我的应用程序中无法正常工作的原因.所有的努力都将受到赞赏.好像我已经在附近但却遗失了一些东西.所以你能告诉的任何事情都可能会有所帮助.

    @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);
}
Run Code Online (Sandbox Code Playgroud)

ben*_*nka 15

当您以全屏模式运行应用程序时,显然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);
}
Run Code Online (Sandbox Code Playgroud)

我已经在Android 4.2和4.3上测试了这两个.

注意:

要关闭全屏:从以下位置
删除:NoTitleBarAndroidManifest.xml

android:theme="@android:style/Theme.Black.NoTitleBar
Run Code Online (Sandbox Code Playgroud)

和/或将这些行添加到MainActivity.java中onCreate方法:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)

  • 这是对的; 全屏意味着在Android上全屏.您的窗口不会缩小状态栏,也不会缩小键盘的缩小.Phonegap依赖于其窗口缩小以检测键盘的存在,因此检测不会在全屏幕中工作.另请注意,即使绝大多数键盘确实导致Phonegap窗口在不全屏时缩小,如果您的用户使用更加非正统的键盘应用程序,您可能仍然无法检测到它.这不是你应该依赖的东西. (2认同)