在WebView出现之前注入JS / CSS

时间:2017-02-27 18:19:45

标签: android android-webview javascript-injection

我已经看到了几个问题,但所有的解决方案对我都没有用。对于客户,我们必须开发一个除了显示WebView和原生DrawerLayout之外什么都不做的应用。但是,我们只有他们的移动网页(带菜单等)。所以我们必须隐藏一些元素。现有样式表保持不变非常重要,只需添加一些其他CSS规则。

到目前为止我已尝试过:

@Override
public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (!mErrorOccured && !noConnectionAvailable) {
            injectCSS();
        }

        mainActivity.hideLoadingScreen();
}

使用此注入:

// Inject CSS method: read style.css/readmode.css from assets folder
// Append stylesheet to document head
private void injectCSS() {
    try {
        Activity activity = (Activity) mContext;
        SharedPreferences sharPref = activity.getSharedPreferences(Constants.PREFERENCE_NAME, Context.MODE_PRIVATE);
        Boolean isReadMode = sharPref.getBoolean(Constants.READMODE_KEY, false);

        InputStream inputStream;

        if (isReadMode) {
            inputStream = activity.getAssets().open("readmode.css");
        } else {
            inputStream = activity.getAssets().open("style.css");
        }

        byte[] buffer = new byte[inputStream.available()];
        inputStream.read(buffer);
        inputStream.close();
        String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
        webView.loadUrl("javascript:(function() {" +
                    "var parent = document.getElementsByTagName('head').item(0);" +
                    "var style = document.createElement('style');" +
                    "style.type = 'text/css';" +
                    // Tell the browser to BASE64-decode the string into your script !!!
                    "style.innerHTML = window.atob('" + encoded + "');" +
                    "parent.appendChild(style);" +
                    "Android.injectCSS('Works!');})()");
        } catch (Exception e) {
            e.printStackTrace();
        }
}

我还尝试添加一个JavaScript接口,该接口使用上面结合的JavaScript的Android.injectCSS('Works!');

@JavascriptInterface
public void injectCSS(String toast) {
    Toast.makeText(mContext, toast, Toast.LENGTH_LONG).show();

    mMainActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mMainFragment.unhideWebView();
        }
    });
}

public void unhideWebView() {
    webView.setVisibility(View.VISIBLE);
}

但是,在隐藏网页元素之前总会有一段延迟。我也试过使用Jsoup。首先,这引发了NetworkOnMainThreadException。在我尝试将其与AsyncTask一起使用之后,无法更改WebView上的onPostExecute(),因为此处理必须位于主线程上。即使使用runOnUiThrad()也无法使用新加载的数据调用loadData()上的WebView

有没有办法在WebView出现之前注入CSS / JS?

0 个答案:

没有答案