2010-12-27 18 views
7

私はAndroind AppでWebViewを使用しています。私は問題があり、解決のための解決を要請する。WebViewが再度 'loadUrl'を呼び出すと、HTMLテキスト入力のキーボードが消えます

HTMLページにテキストフィールドがあります。それは「フォーカス」を取得し、アンドロイドのソフトキーボードがポップアップ表示されるように私の中にキーをできるように、私はJavaコードで

  mWebView.setFocusableInTouchMode(true); 

を呼び出す。

問題は、私は、マルチスレッドを使用する必要がある場合にはJavaのいくつかのプロセスと呼び出しのために

  mWebView.loadUrl(strJSCall); 

JavaScript関数を実行するためのコールバックとして、キーボードが隠される!

私が試みる方法は、キーボードが再び表示されるようにすることです。しかし、 'loadUrl'が呼び出されたとき、キーボードはどのように表示されますか? 誰もが同じ問題を抱え、すでに解決していますか?敬具

+0

Android 3.0(Motorola Zoom)にも同様の問題があります。 Android 2.x搭載の他の端末では正常に動作します。あなたは解決策を見つけましたか? –

答えて

2

Jr.が、私は同じ問題を抱えているし、まだ完全にはそれを解決していません。

私が最初にあなたがキーボードが表示されているかどうかを確認する必要があり、webView.loadUrlを呼び出した後に表示するために、キーボードを強制することができた、私はその後

を呼び出し、この How to check visibility of software keyboard in Android?

の修正版を使用しました

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT); 

私のように、WebViewのJavaScriptと通信する必要がある場合は、キーを押すたびにキーボードが点滅してアニメーションを上下させます。
入力の速さによっては入力の一部が失われます。

5

loadUrlの問題は、UIスレッドを中断し、入力メソッドを閉じてしまうことです。これを行う唯一の堅固な方法は、カーソルがWebview上にあるものを確認し、Webview上のデフォルトのloadUrl動作を上書きすることです。カスタムWebViewの内部

@Override 
public void loadUrl(String url) { 
    HitTestResult testResult = this.getHitTestResult(); 
    if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE) 
    { 
      //Don't do anything right now, we have an active cursor on the EDIT TEXT 
      //This should be Input Method Independent 
    } 
    else 
    { 
     super.loadUrl(url); 
    } 
} 

これは、あなたがWebKitのテキストフィールドにフォーカスを持っている場合、発射からJavascriptを読み込むからネイティブ側を防ぐことができます。これは完璧ではありませんが、WebViewのサイズ変更のいずれかによってテキストフィールドが表示されるかどうかを判断しようとして混乱を避けることができます。 webviewで実行されているJavascriptは正常に動作するはずです。

また、入力中に更新する必要がある場合は、JavaがUIスレッドをブロックしないJavaScriptと通信する別の方法を見つけなければならない場合があります。これは私がまだ適切に解決していないという難しい問題です。

+0

ご返信ありがとうございます。私はこのAPIをオーバーライドしましたが、仮想キーボードを隠すために関数呼び出しを避けるために "反射"方法を使用しました。 –

+0

@Jr。あなたはこれを直すために何をしたのか説明できますか?ありがとう。 – Piotr

1

Androidでは、WebViewからjavascriptを実行することは一方向です。WebView.loadUrl( "javascript:sub(1,1)")を呼び出します。戻り値を直接取得することはできません。

あり、JavaScriptの関数の戻り値を取得するための非同期方法です: How to get return value from javascript in webview of android?

は、しかし、ほとんどのケースでは、我々は代わりに非同期道の同期方法を必要としています。たとえば、clickイベントはAndroid WebViewのonTouch メソッドに渡されますが、クリックした要素情報を読み込むためにJavaScriptを実行します。 、ソリューションが完全に機能していない How to get return value from javascript in webview of android?

waitメソッドので:解決策のように見える、上の非同期から同期メソッドをラップする 1. JavaのP/Vの変数:

は、私は2つの解決策を試してみましたJavaScriptとJavaScriptInterfaceの実行をブロックします。したがって、UIスレッドでjs メソッドの結果を取得する場合は、不可能です。

  1. Java Reflectionを使用して、stringByEvaluatingJavaScriptFromStringのネイティブインタフェースを取得します。 Exist stringByEvaluatingJavaScriptFromString for Android

作品は非常によく、唯一のものは、ページが完成ロード時の初期反射法にある気にする必要があります。私は、WebViewのコンストラクタ内の反射を初期化しようとしましたが、失敗しました。私はコンストラクタが非同期メソッドだと思う。

関連する問題