一、如何在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的网址,但由于我们的拦截处理,变成了百度的网页。