Jetpack Compose - WebView基础使用

WebView是我们在开发中经常会使用到的组件,我们可以用它来展示动态的Html页面。在Android的View体系中,我们可以直接在xml中添加WebView组件即可使用。但是在Jetpack Compose中,并没有可以直接使用的WebView组件。那么我们该如何在Compose中使用WebView呢?

这篇文章将介绍如何在Jetpack Compose中使用WebView,并使用其基础功能。

添加权限

首先,我们需要在Android Manifest中添加权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:usesCleartextTraffic="true">
    </application>

</manifest>

AndroidView

然后我们就需要创建一个Composable组件来展示Web页面:

@Composable
fun WebView(){
  
    // Declare a string that contains a url
    val mUrl = "https://www.google.com"
  
    // Adding a WebView inside AndroidView
    // with layout as full screen
    AndroidView(factory = {
        WebView(it).apply {
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
        }
    }, update = {
        it.loadUrl(mUrl)
    })
}

可以看到,我们使用了AndroidView来包裹WebView组件。在它factory方法中,我们创建一个AndroidX WebView作为实际的展示组件并为其设置layoutParams。最后,我们在它的update方法中调用了loadUrl方法来加载链接。

WebViewClient

如果我们需要拦截特定的URL该怎么实现呢?这里和View一样,我们只需要自定义一个WebViewClient,并重写shouldOverrideUrlLoading即可:

@Composable
fun WebView(){
  
    // Declare a string that contains a url
    val mUrl = "https://www.google.com"
  
    // Adding a WebView inside AndroidView
    // with layout as full screen
    AndroidView(factory = {
        WebView(it).apply {
            this.layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
            this.webViewClient = CustomWebViewClient()
        }
    }, update = {
        it.loadUrl(mUrl)
    })
}

class CustomWebViewClient: WebViewClient(){
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        if(url != null && url.startsWith("https://google.com")){
            return true
        }
        return false
    }
}

WebChromeClient

同样的,我们也可以通过自定义一个WebChromeClient来监听一些Web事件:

@Composable
fun WebView(){
  
    // Declare a string that contains a url
    val mUrl = "https://www.google.com"
  
    // Adding a WebView inside AndroidView
    // with layout as full screen
    AndroidView(factory = {
        WebView(it).apply {
            this.layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
            this.webChromeClient = CustomWebChromeClient()
        }
    }, update = {
        it.loadUrl(mUrl)
    })
}

class CustomWebChromeClient : WebChromeClient() {
    override fun onCloseWindow(window: WebView?) {}
    
    override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {}
}

Library

但是这只适用于无状态的单次加载,如果我们需要获取网页的标题,加载状态,当前加载Url该怎么办呢?同样的,如果我们需要控制网页的前进,后退,以及加载新链接呢?更复杂的是如果我们需要在加载Url的基础上同时支持Post和Html代码的加载呢?

幸运的是,现在已经有一个成熟的第三方库可以提供这些能力的支持。它提供了一个可以直接在Compose中使用的WebView组件。这样,开发者就不需要自行去实现WebView的封装逻辑。此外,它还支持Web页面属性的获取,加载状态的监听等能力,开箱即用,非常方便。

https://github.com/KevinnZou/compose-webview

它的基础使用非常简单,如下就可以完成一个Url的加载和展示:

val state = rememberWebViewState("https://example.com")

WebView(
    state
)

对于它的具体使用介绍,大家可以参考这篇文章:

https://blog.csdn.net/weixin_51235693/article/details/135958631

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jetpack Compose for Desktop 中使用 JNI(Java Native Interface)可以让你与本地代码进行交互,调用 C/C++ 函数或访问本地库。以下是使用 JNI 在 Jetpack Compose for Desktop 中进行 JNI 开发的基本步骤: 1. 创建本地代码库:首先,你需要使用 C/C++ 编写本地代码库。可以使用你喜欢的 C/C++ 编译器将代码编译成动态链接库(.so 或 .dll 文件)。 2. 创建 Java 接口:在你的 Jetpack Compose for Desktop 项目中,创建一个 Java 接口来声明与本地代码库交互的函数。这个接口将作为 Java 和本地代码之间的桥梁。 3. 加载本地库:在你的 Jetpack Compose for Desktop 项目中,使用 `System.loadLibrary()` 或 `System.load()` 方法加载你的本地库。 4. 实现 Java 接口:创建一个 Java 类来实现你在第二步创建的 Java 接口。在这个类中,使用 `native` 关键字标记与本地代码库交互的函数。 5. 生成头文件:使用 `javac -h` 命令生成头文件(.h 文件)。这个命令会根据你在第二步创建的 Java 接口自动生成对应的头文件。 6. 实现本地代码:使用你喜欢的 C/C++ 编辑器打开生成的头文件,并实现其中声明的函数。确保函数签名和参数类型与 Java 接口中的一致。 7. 编译本地代码:使用你喜欢的 C/C++ 编译器编译你的本地代码,并生成动态链接库文件。 8. 调用本地函数:在你的 Jetpack Compose for Desktop 项目中,可以通过调用你在第二步创建的 Java 接口实现的函数来调用本地代码。 需要注意的是,JNI 开发需要一定的 C/C++ 编程经验,以及对 Java 和本地代码交互的机制有一定的了解。在使用 JNI 进行开发时,还需要注意内存管理和线程安全性等问题。确保在使用完本地资源后正确释放它们,以避免内存泄漏或其他问题的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值