3

我在 WebView 中调用 JavaScript 函数并在应用程序中获得响应时遇到了一些问题(在我的 Galaxy Tab 2 '10 上)。我在内容加载后直接调用 js 函数。根据这个解决方案,我使用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 代码,只需在 assets 目录中放置一个空的 html 文件即可index.html


编辑: 我找到了一个解决方案,但我不知道它是否正确。但它有效。我添加了处理程序循环

 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 回答