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 发短信功能

android 开发 string.xml 里面的<drawable name="33f"></drawable> 这个是写路径的吗

Android Studio如何轻松整理字符串到string.xml中

Android中 string.xml资源 如何添加参数?

是否可以在 android 中以编程方式创建 string.xml 文件?