有没有办法在android上有一个webview,我可以在页面加载之前注入css?
Posted
技术标签:
【中文标题】有没有办法在android上有一个webview,我可以在页面加载之前注入css?【英文标题】:Is there a way to have an webview on android where I can inject css before the page is loading? 【发布时间】:2021-08-17 14:41:32 【问题描述】:我需要有一个 webview,在网页加载之前将 CSS 注入网页,以便将注入的 css 应用于加载页面本身。在 ios 网页视图上,这是一个原生功能,但据我所知,在 android 原生网页视图中没有这样的功能。
为此,我尝试在 AppWebview 中使用颤振,但根据他们在 https://inappwebview.dev/docs/javascript/user-scripts/ 的文档,由于同样的原因,他们无法提供该功能,因此无法保证该行为。
有没有提供这种功能的替代 webview?
【问题讨论】:
【参考方案1】:您可以在 Android 网络视图中使用自己的自定义 CSS 样式表来修改或设计时尚的网页。为此,我们只需要一个 CSS 文件和几行代码。
喜欢~
@Override
public void onPageFinished(String URL, WebView view)
super.onPageFinished(view, URL);
// Inject CSS when page is done loading
injectCSS();
);
// Load a web
webl.loadUrl("https://www.example.com");
// Inject CSS method: read style.css from assets folder
// Append stylesheet to document head
private void injectCSS()
try
InputStream inputStream = getAssets().open("black.css");
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
inputStream.close();
String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
webl.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)" +
")()");
catch (Exception e)
e.printStackTrace();
;
希望对你有帮助
参考 - https://www.programmersought.com/article/54381014286/
【讨论】:
但是 onPageFinished get 只在页面加载时触发,对吧?所以用户看到了实际的网页,然后我的 css 被应用了。例如。如果我在我的 css 中隐藏一个元素,它会被加载然后消失。或者,如果我更改文本颜色,则会显示旧颜色然后覆盖。我正在寻找的是在此之前应用 css,以便用户直接看到 css 更改。 那么您可以使用自定义 AlertBox 而不是 CSS...您可以为您的警报框获取许多时尚的模板,或者您也可以在您的项目中使用 CSS,但只需将“CSS 转换为 SVG”,然后用它作为装载的东西。参考 - css-tricks.com/using-svg 非常感谢您的回答!我只知道警报框作为用户对话框,所以很遗憾我还不明白如何使用它来解决我的问题。我想要例如在 webview 中调用“google.com”并将背景更改为红色,这样用户就永远不会看到原始的白色背景,即使在加载过程中也是如此。我将如何使用 AlertBox 来做到这一点? 很抱歉再次询问,但我真的被困在这一点上,并不真正了解如何使用 AlertBox 实现我的目标。你能再给我一些提示吗?【参考方案2】:您可以在 public void onLoadResource(WebView view, String url)
方法中添加您的 CSS 代码,然后它将在页面加载完成之前应用。
它将帮助您防止用户在应用您的 CSS 之前看到实际的网页。
以下是完整代码
webView.setWebViewClient(new MyWebViewClient());
String url = getString(R.string.blogURL);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
WebViewClient
类代码
private class MyWebViewClient extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;
@Override
public void onPageFinished(WebView view, String url)
//if in the website used any javascript to interact with CSS then also add in this method, otherwise remove it from this method.
view.loadUrl("javascript:(function() " +
"var h1 = document.getElementById('et_mobile_nav_menu').style.visibility='hidden'; " +
")()");
@Override
public void onLoadResource(WebView view, String url)
super.onLoadResource(view, url);
view.loadUrl("javascript:(function() " +
"var h1 = document.getElementById('et_mobile_nav_menu').style.visibility='hidden'; " +
")()");
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
Toast.makeText(BlogActivity.this, "Something is wrong while loading blog. Please try again", Toast.LENGTH_SHORT).show();
希望对某人有所帮助
【讨论】:
以上是关于有没有办法在android上有一个webview,我可以在页面加载之前注入css?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在Android上将arraybuffer从javascript传递到java?
有没有办法知道一个h5页面是不是在android平台上加载了webview?
有没有办法让颤动的 webview 使用 android 相机进行文件上传?如何在 webview_flutter 中打开文件选择器?
有没有办法让 WebView 在 Android 中自动链接 URL 和电话号码?
有没有办法预先缓存网页以使用 Android WebView 查看?
Xamarin.Forms - 如果 webView 包含在 Android 上打开的模式或菜单,有没有办法禁用拉刷新?