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
                )
            }
        }
    }
}

效果:
Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件
可以看到基本按照我们所写的格式。点击链接的话,会提示打开浏览器,打开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链接事件

上一篇:【node】node连接mongodb操作数据库


下一篇:cpppp