Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件
Posted zuguorui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件相关的知识,希望对你有一定的参考价值。
一、如何在string.xml中定义html文档
首先最好自己在外部新建一个html文件,然后开始写自己的内容。并且在浏览器中预览效果。
首先预先编写一个简单的html文档:
<html>
<head>
<style type="text/css">
body
color: #111;
p
font-size: 1.5em;
</style>
</head>
<body>
<h1>这是标题1</h1>
<p>这是一个链接</p>
<a href="https://www.bing.com.cn">打开bing</a>
</body>
</html>
然后在string.xml中添加节点:
<string name="html_content">
<Data>
<![CDATA[
<html>
<head>
<style type="text/css">
body
color: #111;
p
font-size: 1.5em;
</style>
</head>
<body>
<h1>这是标题1</h1>
<p>这是一个链接</p>
<a href="https://www.bing.com.cn">打开bing</a>
</body>
</html>
]]>
</Data>
</string>
主要的就是在string节点中要包含Data,然后使用CDATA包裹起来。这样在使用getResource().getString()
后获取的字符串,仍然是仅包含html文本而不包含Data和CDATA标签的,你可以在下一步中打印查看。因此我们从文件中直接读取html也是可以的,而不必一定将其放在strings.xml中。
二、使用WebView将其显示出来
新建一个Activity,仅包含一个WebView。
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".HtmlActivity"
>
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/web_view"
></WebView>
</layout>
在Activity中加载html。
class HtmlActivity : AppCompatActivity()
private lateinit var mBinding: ActivityHtmlBinding
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_html)
LoadHtmlTask().execute()
//使用AsyncTask读取HTML并加载,当然也可以直接放在主线程中,不过考虑到一般html都比较大,或者可能
//会从文件中读取,比较耗时。
//设置为inner,与java中的普通内部类等价,如果不加inner,在kotlin中默认等价为java中的静态内部类,是无法访问
//外部类的方法和属性的。
private inner class LoadHtmlTask: AsyncTask<Void, Void, String>
constructor()
override fun doInBackground(vararg params: Void?): String
var s: String = resources.getString(R.string.html_content)
return s
override fun onPostExecute(result: String?)
super.onPostExecute(result)
if(result != null)
mBinding.webView.settings
mBinding.webView.setBackgroundColor(Color.TRANSPARENT)
mBinding.webView.isHorizontalScrollBarEnabled = false
mBinding.webView.loadData(
result, "text/html; charset=UTF-8", null
)
效果:
可以看到基本按照我们所写的格式。点击链接的话,会提示打开浏览器,打开bing网页。
三、拦截WebView中的链接点击事件
需要为WebView设置一个WebViewClient。
override fun onPostExecute(result: String?)
super.onPostExecute(result)
if(result != null)
mBinding.webView.settings
mBinding.webView.setBackgroundColor(Color.TRANSPARENT)
mBinding.webView.isHorizontalScrollBarEnabled = false
mBinding.webView.loadData(
result, "text/html; charset=UTF-8", null
)
//此处为Kotlin的匿名内部类的写法
mBinding.webView.webViewClient = object: WebViewClient()
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean
if (request?.url.toString().contains("bing.com.cn"))
openMailClient()
return true
return super.shouldOverrideUrlLoading(view, request)
然后编写openMainClient方法
private fun openMailClient()
var uri = Uri.parse("https://www.baidu.com")
var intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
当点击链接后,虽然链接是bing的网址,但由于我们的拦截处理,变成了百度的网页。
以上是关于Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件的主要内容,如果未能解决你的问题,请参考以下文章
在android开发中,关于string和string.xml的问题
android 开发 string.xml 里面的<drawable name="33f"></drawable> 这个是写路径的吗