Android 在WebView显示之前插入JS/CSS

Android 在WebView显示之前插入JS/CSS,android,android-webview,javascript-injection,Android,Android Webview,Javascript Injection,我已经看到了一些关于这方面的问题,但所有的解决方案都不适合我。对于客户端,我们必须开发一个除了显示WebView和本地DrawerLayout之外实际上什么都不做的应用程序。但是,我们只有他们的手机网页(带有菜单等)。所以我们必须隐藏一些元素。保持现有样式表不变非常重要,只是添加了一些其他CSS规则 到目前为止,我所尝试的: @Override public void onPageFinished(WebView view, String url) { super.onPageF

我已经看到了一些关于这方面的问题,但所有的解决方案都不适合我。对于客户端,我们必须开发一个除了显示
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接口,该接口使用
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();
        }
    });
}
以及:

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


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

看看我的答案:除此之外,你还可以拦截加载一个CSS文件,如以下线程所述:。但与其替换它的数据,不如简单地用附加的css规则附加它
public void unhideWebView() {
    webView.setVisibility(View.VISIBLE);
}