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!')上面的JavaScript代码>与以下代码组合:
@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);
}