我需要做一个非常简单的事情 - 找出是否显示了软件键盘.这在Android中可行吗?
理想情况下,我希望整个界面都有一个自定义样式,可以在ios(itouch/ipad)上找到,或者在虚拟键盘存在的情况下等效.请参阅下面的更多细节.
当键盘"存在"时,自定义设置CSS黑客规则是活动的,也是可接受的解决方案.
在网站上定位机器人和ios(HTML/JavaScript/CSS)另请注意,内部布局为:"流畅".
编辑:这是更多的设计,然后是文字; 所以这些变化并没有让人迷失方向.在最低级别,我只想在有和没有虚拟键的情况下进行设计更改(也许只是背景更改).
这是一个好的或坏的设计理念的问题是有争议的.但是,我觉得这个问题无关紧要.对于这样的漏洞利用可以使用更多文本(例如游戏或交互式媒体).
因此,赏金:尽管不再需要我正在研究的项目的答案(使用了替代设计).我仍然相信这个问题可以从回答中受益.
默认行为
+--------+
| |
+------------+ +-+-hidden-+-+ <- ~50% hidden
| +--------+ | | +--------+ |
| | | | | |visible | |
| | | | \ | | | | <- ~50% visible
| | 100% | | ==> | +--------+ |
| | | | / | |virtual | |
| | | | | | keys | |
| +--------+ | | +--------+ …Run Code Online (Sandbox Code Playgroud) 我一直在思考这个问题,我无法想办法解决这个问题.有没有办法检测用户是使用虚拟(软件)键盘还是传统(硬件)键盘?
新的Windows Surface在封面上有自己的键盘,对于Android/iPad,有大量不同的蓝牙键盘.
那么,你们中有人对此有任何意见吗?
我的目标是Android,IOS和Windows平板电脑/手机.
动机:(非常主观)
在开发平板电脑/智能手机的网络应用程序时,我已经认识到在许多情况下使用JavaScript键盘而不是操作系统的软件键盘会更容易.
假设您要输入PIN码.而不是让键盘填满屏幕的一半:
软件(OS)键盘:
|----------------|
| [ input] |
| |
|----------------|
| 1 2 3 4 5 |
| 6 7 8 9 0 |
|----------------|
Run Code Online (Sandbox Code Playgroud)
JavaScript键盘:
|----------------|
| [ input] |
| | 1 2 3| |
| | 4 5 6| |
| |_7_8_9| |
| |
| |
|----------------|
Run Code Online (Sandbox Code Playgroud)
如果您需要处理大量输入,可能需要对输入进行叠加div并使用软件键盘:
|----------------|
| P1 P2 P3 P4 |
| [inp 1][inp 2] |
|----------------|
| KEYBOARD |
| | …Run Code Online (Sandbox Code Playgroud) 更新
虽然不是最优雅的解决方案,但似乎有效的一种方法是观察相关的注册表值.这是使用WMI执行此操作的示例.如果有更好的解决方案,我会很高兴听到任何人的意见.
using System;
using System.Management;
using System.Security.Principal;
using System.Windows.Forms;
using Microsoft.Win32;
public partial class MainForm : Form
{
public MainForm()
{
this.InitializeComponent();
this.UpdateModeFromRegistry();
var currentUser = WindowsIdentity.GetCurrent();
if (currentUser != null && currentUser.User != null)
{
var wqlEventQuery = new EventQuery(string.Format(@"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell' AND ValueName='TabletMode'", currentUser.User.Value));
var managementEventWatcher = new ManagementEventWatcher(wqlEventQuery);
managementEventWatcher.EventArrived += this.ManagementEventWatcher_EventArrived;
managementEventWatcher.Start();
}
}
private void ManagementEventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
this.UpdateModeFromRegistry();
}
private void UpdateModeFromRegistry()
{
var tabletMode = (int)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell", …Run Code Online (Sandbox Code Playgroud) 我试图在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)
这里后退按钮事件被解雇和罚款,但工作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);
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码也没有在show或hide键盘上执行.此功能仅在首次应用时执行.开始了.我在某些地方看到,对于某些人来说这些事件正在发挥作用,所以我觉得我身边有一些问题,可能是在一些配置文件等等.所以下面是androidmanifest.xml代码:
<?xml version='1.0' encoding='utf-8'?> …Run Code Online (Sandbox Code Playgroud) javascript-events android-softkeyboard android-event cordova cordova-3