Программно показать мягкую клавиатуру на iPhone в приложении PhoneGap?
Я искал далеко и долго, и до этого момента я не наткнулся на рабочего раствора для приложений PhoneGap / Cordova, которые будут показывать программную клавиатуру.
сценарий:
у нас есть приложение PhoneGap - веб - сайт, созданный в jQuery Mobile, который в какой-то момент показывает диалог пользователю. Это диалоговое окно также является веб-страницей и имеет одно текстовое поле ввода, в котором пользователь должен ввести код.
проблема:
когда отображается диалоговое окно кода,поле ввода фокусируется с помощью JavaScript. Однако из-за ограничений, наложенных на внутренний браузер iPhone, мягкая клавиатура не появляется, пока пользователь действительно не щелкнет внутри текстового поля ввода.
что мы пробовали:
- создание скрытый текст вставка и сделать это первый ответчик
- сделать webview первый ответчик как только вход получает фокус через JavaScript
- используя sendActionsForControlEvents чтобы попробовать и delive сенсорные события в webview (хотя, если у кого-то есть рабочий код для приложения PhoneGap, я был бы признателен, если бы они могли поделиться им, так как я не профессионал в iOS кодирование)
какие идеи?
EDIT: ограничение, упомянутое в этом вопросе, для Встроенные браузеры только... если вы нацеливаете Opera, вы будете успешны, используя следующий код:
var e = jQuery.Event("keydown", { keyCode: 37 });
$('#element').focus().trigger(e);
EDIT2: это окончательный рабочий код PhoneGap, который можно использовать в плагине:
keyboardhelper.h
//
// keyboardHelper.h
// soft keyboard displaying plugin for PhoneGap
//
// Copyright 2012 Martin Ambrus.
//
#import <Foundation/Foundation.h>
#ifdef CORDOVA_FRAMEWORK
#import <Cordova/CDVPlugin.h>
#else
#import "CDVPlugin.h"
#endif
@interface keyboardHelper : CDVPlugin {
NSString *callbackID;
}
@property (nonatomic, copy) NSString *callbackID;
- (void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
@end
keyboardhelper.м
//
// keyboardHelper.m
// soft keyboard displaying plugin for PhoneGap
//
// Copyright 2012 Martin Ambrus.
//
#import "keyboardHelper.h"
#import "AppDelegate.h"
@implementation keyboardHelper
@synthesize callbackID;
-(void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
self.callbackID = [arguments pop];
//Get text field coordinate from webview. - You should do this after the webview gets loaded
//myCustomDiv is a div in the html that contains the textField.
int textFieldContainerHeightOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById("myCustomDiv").offsetHeight;"] intValue];
int textFieldContainerWidthOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById("myCustomDiv").offsetWidth;"] intValue];
int textFieldContainerYOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById("myCustomDiv").offsetTop;"] intValue];
int textFieldContainerXOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById("myCustomDiv").offsetLeft;"] intValue];
UITextField *myTextField = [[UITextField alloc] initWithFrame: CGRectMake(textFieldContainerXOffset, textFieldContainerYOffset, textFieldContainerWidthOutput, textFieldContainerHeightOutput)];
[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView addSubview:myTextField];
myTextField.delegate = self;
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"ok"];
[self writeJavascript:[pluginResult toSuccessCallbackString:self.callbackID]];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
-(BOOL)textFieldDidEndEditing:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
@end
в JavaScript
var keyboardHelper = {
showKeyboard: function(types, success, fail) {
return Cordova.exec(success, fail, "keyboardHelper", "showKeyboard", types);
}
};
7 ответов
вы можете получить координаты для поля ввода с помощью javascript в webView. Затем поместите свое собственное текстовое поле прямо поверх него и в его методе делегата textFieldShouldReturn отправьте запрос на сервер с кодом, введенным пользователем.
//Get text field coordinate from webview. - You should do this after the webview gets loaded
//myCustomDiv is a div in the html that contains the textField.
int textFieldContainerHeightOutput = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetHeight;"] intValue];
int textFieldContainerWidthOutput = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetWidth;"] intValue];
int textFieldContainerYOffset = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetTop;"] intValue];
int textFieldContainerXOffset = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetLeft;"] intValue];
myTextField.frame = CGRectMake(textFieldContainerXOffset, textFieldContainerYOffset, textFieldContainerWidthOutput, textFieldContainerHeightOutput);
[webView addSubview:myTextField];
myTextField.delegate = self;
затем вы реализуете textFieldShouldReturn и создаете свой запрос на сервер там.
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
это делается в существующем проекте, однако без использования PhoneGap. Я надеюсь, что вы можете приспособить его к вашим по необходимости.
удалить текстовое поле, вы можете скрыть его
myTextField.hidden = YES;
или
myTextField = nil;
или
[myTextField removeFromSuperView];
вы можете решить проблему с помощью config.xml запись в эти дни, добавлю:
<preference name="keyboardDisplayRequiresUserAction" value="false" />
до iOS 6 Apple разрешала выводить клавиатуру только после взаимодействия с пользователем. В iOS 6 они ввели следующее свойство для UIWebView, которое вам просто нужно установить в NO.
"yourWebView".keyboardDisplayRequiresUserAction = NO;
Apple по умолчанию устанавливает значение "Да". Теперь вы можете позвонить focus() в JS и клавиатура появится.
вы пробовали использовать собственные элементы управления и вызывать их из Javascript?
здесь у вас есть код, который показывает использование собственных элементов управления в приложении Phonegap Cordova (Phonegap 1.5)
https://gist.github.com/1384250
надеюсь, это поможет решить проблему:)
Я признаю, что это личное, но это может помочь вам:
@class UIKeyboard;
void showKeyboard()
{
static UIKeyboard *kb = nil;
if ([[UIKeyboard class] respondsToSelector:@selector(automaticKeyboard)])
kb = [UIKeyboard automaticKeyboard];
else
kb = [UIKeyboard activeKeyboard];
if (kb == nil) {
kb = [[[UIKeyboard alloc] initWithDefaultSize] autorelease];
[[[UIApplication sharedApplication] keyWindow] addSubview:kb];
}
if ([kb respondsToSelector:@selector(orderInWithAnimation:)]) {
[kb orderInWithAnimation:YES];
} else {
[kb activate];
[kb minimize];
[kb maximize];
}
}
и назовите это так:
showKeyboard();
Я на самом деле только что нашел решение этой. Как говорит Хорак и как описанные в этой статье, С или без мягкой клавиатуры, теперь можно достичь этого с iOS 6.0 с помощью:KeyboardDisplayRequiresUserAction = нет;
начиная с Cordova 2.2, свойство iOS, упомянутое выше, можно просто добавить в Кордова.файл plist:
KeyboardDisplayRequiresUserAction, boolean, NO
Это решает все для всех, используя Cordova 2.2. Теперь просто звоните вход.focus () как уже обсуждалось ранее, и клавиатура появится автоматически. Для тех из нас, кто еще не обновил нашу Cordova до текущей последней версии (2.2), это к счастью еще можно.
программно показать клавиатуру на iPhone с помощью cordova V.
Шаг 1: добавление свойства в Cordova.файл plist
перейдите в свой проект > ресурсы > Cordova.файл plist. Добавлять: KeyboardDisplayRequiresUserAction, boolean, NO
Шаг 2: добавление ниже фрагмента кода в CDVViewController.м
Поиск для "@interface CDVViewController " (или аналогично найти выше файл). Для Cordova 2.1, перейдите к строка 240 (все остальные идут к строке после "IsAtLeastiOSVersion" если заявление, извините, не может быть более точным, чем это.) добавить этот фрагмент кода в свой Экземпляраcdvviewcontroller.m по вышеупомянутой строке:
if (IsAtLeastiOSVersion(@"6.0")) {
BOOL keyboardDisplayRequiresUserAction = YES; // KeyboardDisplayRequiresUserAction - defaults to YES
if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] != nil) {
if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"]) {
keyboardDisplayRequiresUserAction = [(NSNumber*)[self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] boolValue]; //JB-VAL121212
}
}
// property check for compiling under iOS < 6
if ([self.webView respondsToSelector:@selector(setKeyboardDisplayRequiresUserAction:)]) {
[self.webView setValue:[NSNumber numberWithBool:keyboardDisplayRequiresUserAction] forKey:@"keyboardDisplayRequiresUserAction"];
}
}
отказ от ответственности: это было протестировано только на Cordova 2.1, однако, очень вероятно, что он все еще работает с 2.0 или любой другой более ранней версией, которая поставляется с CDVViewController.файл м)
вы можете использовать событие FocusOut в поле ввода, и оно будет запущено при нажатии клавиши Done. Я мог бы использовать это на IOS 6 и выше. Я считаю, что он также будет работать на предыдущих версиях.