web-dev-qa-db-ja.com

PhoneGapアプリケーションでiPhoneのソフトキーボードをプログラムで表示しますか?

私はずっと長い間検索してきましたが、今のところ、ソフトキーボードを表示するPhoneGap/Cordovaアプリケーションの作業ソリューションに出くわしませんでしたプログラム的に。

シナリオ:

PhoneGapアプリケーション(jQuery Mobileで作成されたWebサイト)があり、ある時点でユーザーにダイアログが表示されます。このダイアログもWebページであり、ユーザーがコードを入力する必要がある1つのINPUTテキストボックスがあります。

問題:

コードダイアログが表示されると、入力ボックスはJavaScriptを使用してフォーカスされます。ただし、iPhoneの内部ブラウ​​ザの制限により、ユーザーが実際に入力テキストボックス内をクリックするまで、ソフトキーボードは表示されません。

私たちが試したこと:

  • 隠しテキストボックスを作成し、ファーストレスポンダ
  • javaScriptを介して入力がフォーカスを受け取ったら、実際のWebviewを最初のレスポンダーにします
  • sendActionsForControlEventsを使用してTouchイベントを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.m

//
//  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);
    }
};
27
Zathrus Writer

WebViewでJavaScriptを使用して、入力フィールドの座標を取得できます。次に、その上に独自のtextFieldを配置し、そのデリゲートメソッド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];
7
Andrei Filip

最近、config.xmlエントリで問題を解決できます。追加するには:

<preference name="keyboardDisplayRequiresUserAction" value="false" />
12
Hendrik

IOS 6より前では、Appleは、ユーザーインタラクション後のキーボードの起動のみを許可していました。iOS6では、UIWebViewに次のプロパティを導入しましたが、これを単にNOに設定するだけで済みます。

_    "yourWebView".keyboardDisplayRequiresUserAction = NO;
_

Appleはこれをデフォルトで「はい」に設定します。これで、JSでfocus()を呼び出すことができ、キーボードが表示されます。

5
Karoh

ネイティブコントロールを使用して、JavaScriptからそれらを呼び出してみましたか?

ここに、Phonegap Cordovaアプリケーション(Phonegap 1.5)でのネイティブコントロールの使用法を示すコードがあります。

https://Gist.github.com/138425

それが問題を解決するのに役立つことを願っています:)

3
axierjhtjz

私は実際にこれに対する解決策を見つけました。 horakが言うように この記事で説明 のように、ソフトキーボードの有無にかかわらず、次のコマンドを使用してiOS 6.0でこれを実現できます:KeyboardDisplayRequiresUserAction = NO;

Cordova 2.2以降では、上記のiOSプロパティを単にCordova.plistファイルに追加できます。

KeyboardDisplayRequiresUserAction, boolean, NO

これにより、Cordova 2.2を使用しているすべての人がすべて解決します。ここで、前述のようにinput.focus()を呼び出すだけで、キーボードが自動的に表示されます。 Cordovaを最新の最新バージョン(2.2)にまだ更新していない私たちにとっては、幸運にもまだ可能です

Cordova v。<2.2を使用して、iPhoneのプログラムでキーボードを表示する

ステップ1Cordova.plistにプロパティを追加

プロジェクト>リソース> Cordova.plistに移動します。追加:KeyboardDisplayRequiresUserAction、boolean、NO

ステップ2以下のコードスニペットをCDVViewController.mに追加します

「@ interface CDVViewController」を検索(または上記のファイルを検索するのと同様)。 Cordova 2.1の場合は、行240に移動します(「IsAtLeastiOSVersion」の後の行に誰もが移動します) ifステートメントの場合、申し訳ありませんがそれ以上正確にすることはできません。)このコードスニペットを上記の行の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.mファイルに付属するその他の以前のバージョン)

3
Jonathan

私はこれがプライベートであることを認めますが、あなたを助けるかもしれません:

@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();
3
user529758

入力フィールドでFocusOutイベントを使用できます。これは、Doneキーが押されたときに発生します。これはIOS 6以上で使用できます。以前のバージョンでも動作すると思います。

0
Prince Nishchal