-1

我正在向 webview 添加内容,然后在页面上运行一些 javascript。该脚本确实有效,但在我第一次加载 webview 时它不起作用。如果我第一次在应用程序中加载 webview,它不会改变内容。我第二次加载 web 视图(即返回然后单击相同的列表项),javascript 将工作并为我更改内容。

这是我的设置,在第一次加载时不起作用但在第二次加载时起作用的 javascript 在 AsyncTask 的 onPostExecute 中

在 onCreateView

WebSettings webSettings = mWebView.getSettings();

webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewFragmentClient());
mMainLayout.setBackgroundColor(MainActivity.mSettings.isNightMode() ? Color.DKGRAY : Color.WHITE);

WebViewClient 捕获页面加载完成,然后运行 ​​JS 并显示视图

private class WebViewFragmentClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
        // Page is loaded update the contents textsize and mode and set it visible
        view.loadUrl(String.format("javascript:(document.body.className = '%s');", MainActivity.mSettings.isNightMode() ? "night" : "day"));
        view.loadUrl(String.format("javascript:(document.body.style.fontSize ='%spt');", MainActivity.mSettings.getTextSize()));
        view.setVisibility(View.VISIBLE);

        super.onPageFinished(view, url);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {         
        return mCallBack.pageLinkSelected(url);
    }
}

数据的异步加载

private class AsyncLoadContent extends AsyncTask<Void, Void, Void> {
    String mContent;

    @Override
    protected void onPreExecute() {
        mWebView.setVisibility(View.INVISIBLE);
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Set the content of the page
        mContent = mCallBack.getContent();
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        mWebView.loadDataWithBaseURL("file:///android_asset/", mContent, "text/html", "utf-8", null);
    }
}

谢谢, 曼

4

1 回答 1

1

不要使用 AsyncTask,WebView 自己处理页面加载。loadDataWithBaseURL 是异步方法并立即返回。使用WebViewClient监听页面加载完成。

于 2013-01-10T15:12:16.327 回答