我已经看到了几个问题,但所有的解决方案对我都没有用。对于客户,我们必须开发一个除了显示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?