27

私は長い間検索してきましたが、現時点では、ソフト キーボードをプログラムで表示する PhoneGap / Cordova アプリケーションの実用的なソリューションは見つかりませんでした。

シナリオ:

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

問題:

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

私たちが試したこと:

  • 非表示のテキスト ボックスを作成し、ファーストレスポンダにする
  • 入力が JavaScript を介してフォーカスを受け取ると、実際のwebview をファーストレスポンダーにする
  • sendActionsForControlEventsを使用してTouch イベントを webview に配信しようとします (ただし、私は iOS コーディングの専門家ではないため、PhoneGap アプリケーションの動作するコードを誰かが持っている場合は、共有していただければ幸いです)

何か案は?


編集:この質問で言及されている制限は、組み込みブラウザーのみを対象としています... Opera を目指している場合は、次のコードを使用することで成功します:

var e = jQuery.Event("keydown", { keyCode: 37 });
$('#element').focus().trigger(e);

EDIT2:これは、プラグインで使用できる最終的な PhoneGap コードです。

キーボードヘルパー.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

キーボードヘルパー.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);
    }
};
4

7 に答える 7

12

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

<preference name="keyboardDisplayRequiresUserAction" value="false" />
于 2014-03-26T20:10:12.197 に答える
7

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];
于 2012-09-05T10:12:08.020 に答える
4

Prior to iOS 6, Apple only allowed the keyboard to be brought up following a user interaction. In iOS 6 they've introduced the following property for UIWebView which you merely need to set to NO.

    "yourWebView".keyboardDisplayRequiresUserAction = NO;

Apple sets this by default to "Yes". Now you can call focus() in your JS and the keyboard will appear.

于 2012-10-22T16:44:59.727 に答える
3

私は実際にこれに対する解決策を見つけました。horak が述べているように、またこの記事で説明されているように、ソフト キーボードの有無にかかわらず、iOS 6.0 では次を使用してこれを実現できるようになりました

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

KeyboardDisplayRequiresUserAction, boolean, NO

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

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

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

プロジェクト > Resources > Cordova.plist に移動します。追加: KeyboardDisplayRequiresUserAction、ブール値、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 ファイルに付属するその他の以前のバージョンでも動作する可能性が非常に高いです)

于 2012-12-10T21:26:32.363 に答える
3

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

@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();
于 2012-08-29T12:38:38.477 に答える
3

Native Controls を使用して Javascript から呼び出してみましたか?

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

https://gist.github.com/1384250

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

于 2012-08-29T12:31:25.453 に答える
0

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

于 2013-02-16T02:33:49.847 に答える