-1

WebView にコンテンツを追加してから、ページで JavaScript を実行しています。スクリプトは機能しますが、初めて webview をロードしたときに機能しません。アプリで初めて webview を読み込んだ場合、コンテンツは変更されません。2 回目に Web ビューをロードすると (つまり、戻って同じリスト項目をクリックすると)、JavaScript が機能し、コンテンツが変更されます。

これが私のセットアップです。最初のロードでは機能しないが、2番目のロードでは機能するjavascriptは、AsyncTaskのonPostExecuteにあります

IN 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);
    }
}

ありがとう、Dマン

4

1 に答える 1

1

AsyncTask を使用しないでください。WebView はページの読み込み自体を処理します。loadDataWithBaseURL は非同期メソッドであり、すぐに戻ります。WebViewClientを使用して、ページの読み込みが完了したことをリッスンします。

于 2013-01-10T15:12:16.327 に答える