3

WebView で JavaScript 関数を呼び出し、アプリで応答を取得する際に問題があります (Galaxy Tab 2 '10 で)。コンテンツのロード後に直接 js 関数を呼び出します。この1つのソリューションによると、私はPictureListener

webView.setPictureListener(new PictureListener() {
        @Override
        public void onNewPicture(WebView view, Picture picture) {
            webView.loadUrl("javascript: JsImpl.init('{response}');");
        }
});

正常に動作します: コンテンツが読み込まれると、常に onNewPicture が開始されます。 "javascript: JsImpl.init('{response}')以下を呼び出す js をロードします。

class JsImpl {
    private final static String LOG_TAG = "JsImpl";

    @JavascriptInterface
    public void init(String json) {
        Log.d(LOG_TAG, json);
    }
}

ログにD/JsImpl(18400): {response}. 万事順調そうに見えますが…

タブを横向きまたは縦向きモードに切り替えると、WebView再作成されonNewPictureて開始されますが、メソッドpublic void init(String json)JsImplまったく呼び出されないことがよくあります!

したがって、向きを変えると、jsが機能する場合と機能しない場合があります。例外もエラーもありません...

誰が同じ問題に直面しましたか?

以下は完全なコードです

public class NextActivity extends Activity {

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    final WebView wv = (WebView) findViewById(R.id.WebView);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.loadUrl("file:///android_asset/index.html");
    wv.addJavascriptInterface(new JsImpl(), "JsImpl");

    wv.setPictureListener(new PictureListener() {
        @Override
        public void onNewPicture(WebView view, Picture picture) {
            wv.loadUrl("javascript: JsImpl.init('{responce}');");
        }
    });
}

class JsImpl {
    private final static String LOG_TAG = "JsImpl";

    @JavascriptInterface
    public void init(String json) {
        Log.d(LOG_TAG, json);
    }
}

}

ここでは html コードは必要ありません。アセット ディレクトリに空の html ファイルを配置するだけですindex.html


編集: 私は1つの解決策を見つけましたが、それが正しいバリエーションであるかどうかは正確にはわかりません. しかし、それは機能します。ハンドラループを追加しました

 final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (isJSSetup) return;
            Log.i("handler-loop", "JS didn't handle. Reload page");
            wv.loadUrl(CONTENT_PAGE);
            handler.postDelayed(this, 1000);
        }
    }, 1000);

@JavascriptInterface init(String json) を呼び出すと、 にisJSSetupなりましtrueた。ハンドラー ループで、JS がセットアップされているかどうかを確認しますif (isJSSetup) return;。いいえ - URL を再度リロードします wv.loadUrl(CONTENT_PAGE) を呼び出し、init(String json) を呼び出します。うまくいかない限り。ハードコードなので、まだ良い解決策を探しています。

4

1 に答える 1

1

これが役立つことを願っていますが、方向の変更後に WebView がどのように復元されるかを示していないため、確かなことは言えません。

向きを変更した後、ネストされたフラグメントを適切に機能させるのに非常に苦労していました。画面の回転中にフォームの値とすべての機能を保持したかったのです。向きの変更後にJavascriptInterfaceがまったく機能しなかったことを除いて、すべて正常に機能しました。

私の WebView は onCreateView で復元されます。WebView の restoreState 呼び出しを削除する必要がありましたが、すべて機能するようになりました。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.layoutT4, container, false);
    webView = (WebView) rootView.findViewById(R.id.webViewT4);
    prepareBrowser();   // the browser is initiated here including the JavascriptInterface

    if (webView != null) {
        String URL = (savedInstanceState == null) ? "" : savedInstanceState.getString("URL");
        if (URL.equals("")) {
            webView.loadUrl("yourhome.html");    
        } else {
            //webView.restoreState(savedInstanceState.getBundle("webViewBundle"));  // this line was preventing the JavascriptInterface to work properly
            webView.loadUrl(URL);   // this is saved in onSaveInstanceState - I just reopen the URL here, the PHP page will take care of reloading the data
        }
    }
    return rootView;
}
于 2013-12-25T19:31:01.813 に答える