我正在努力解决这个问题。我正在构建我的第一个Hello World! android(cordova)应用程序,需要键盘始终显示并避免隐藏它,就像用户单击后退按钮或任何其他输入时一样。
为什么?基本上我没有在我的HTML中有任何输入元素来触发焦点&显示键盘,它是一种终端模拟器'用户执行某些命令的位置。
键盘根本没有显示,所以我去了,我添加了以下内容:
已安装的离子键盘插件
cordova plugin add https://github.com/driftyco/ionic-plugins-keyboard.git
添加了config.xml的权限
<feature name="Keyboard">
<param name="android-package" value="com.ionic.keyboard.IonicKeyboard" />
<param name="onload" value="true" />
</feature>
在我的App模块中,以下行:
var myApp = angular.module('myApp', ['ionic']);
myApp.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
if(window.cordova && window.cordova.plugins.Keyboard) {
window.cordova.plugins.Keyboard.show(); // Show Keyboard on startup
// and here Trigger a show keyboard when hidden
window.addEventListener('native.hidekeyboard', keyboardHideHandler);
function keyboardHideHandler(e){
window.cordova.plugins.Keyboard.show();
}
}
});
});
现在,上面的实现工作正常,但我不认为以这种方式处理它是优雅的,我不喜欢键盘关闭然后再次弹出的感觉。
希望我走在正确的轨道上。任何提示都会受到赞赏。
谢谢
截图
答案 0 :(得分:5)
platforms/android
中编辑实际的Cordova Android文件以覆盖以下方法(取自https://stackoverflow.com/a/6571093/1091751):
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
InputMethodManager manager = (InputMethodManager) this.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
manager.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
}
return false;
}
我还没有测试过这个,但是如果你添加一个隐藏的输入,当你的应用加载时你最初关注它然后在它失去焦点时不断重新聚焦怎么办?我不确定这与显式调用keyboard.show()有什么不同,但它可能会阻止键盘打开/关闭抖动。
类似的东西:
<input constant-focus id="hiddenFocus" type="hidden">
然后
document.getElementById('hiddenFocus').focus()
然后不断重新调整它以保持键盘:
// HTML tag = constant-focus
.directive('constantFocus', function(){
return {
restrict: 'A',
link: function(scope, element, attrs){
element[0].addEventListener('focusout', function(e){
element[0].focus();
});
}
};
})
答案 1 :(得分:0)
嗯,我想我想出了一个不同的方式,仍然不确定这是否应该如何处理。
在Taps上添加一个事件监听器
myApp.directive('detectGestures', function ($ionicGesture) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
var gestureType = attrs.gestureType;
switch (gestureType) {
case 'doubletap':
$ionicGesture.on('doubletap', scope.reportEvent, elem);
break;
}}}
});
然后在我的控制器中,如果键盘是可见的,则关闭其他显示
$scope.reportEvent = function (event) {
if (event.type == 'doubletap') {
$timeout(function () {
if (window.cordova && window.cordova.plugins.Keyboard) {
if(cordova.plugins.Keyboard.isVisible){
window.cordova.plugins.Keyboard.close();
} else {
window.cordova.plugins.Keyboard.show();
}
}
}, 500);
}
};
让我知道你的想法。
谢谢!