kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页

简介: 在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:

kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页。 按钮在上方topAppBar右上角




通义千问


import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import android.webkit.WebView
import android.webkit.WebViewClient
import android.webkit.CookieManager

@Composable
fun TopAppBarWithWebViewAndRefresh(url: String) {
    val context = LocalContext.current
    var webViewState by remember { mutableStateOf<WebView?>(null) }
    var isRefreshing by remember { mutableStateOf(false) }

    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = "Web View with Refresh") },
                actions = {
                    IconButton(onClick = { 
                        if (webViewState != null) {
                            isRefreshing = true
                            webViewState?.reload()
                        }
                    }) {
                        Icon(Icons.Default.Refresh, contentDescription = "Refresh")
                    }
                }
            )
        }
    ) {
        Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Top
        ) {
            AndroidView(
                factory = {
                    WebView(context).apply {
                        webViewClient = object : WebViewClient() {
                            override fun onPageFinished(view: WebView?, url: String?) {
                                super.onPageFinished(view, url)
                                // 页面加载完成后设置Cookie
                                CookieManager.getInstance().apply {
                                    setAcceptThirdPartyCookies(this@apply, true)
                                    CookieManager.getInstance().setCookie(url ?: "", "YOUR_COOKIE_STRING")
                                }
                                isRefreshing = false // 页面加载完,停止刷新状态
                            }
                        }
                        settings.javaScriptEnabled = true
                        loadUrl(url)
                        webViewState = this
                    }
                },
                modifier = Modifier.weight(1f)
            )
            
            // 可选:显示刷新指示器
            if (isRefreshing) {
                CircularProgressIndicator(modifier = Modifier.align(Alignment.CenterHorizontally))
            }
        }
    }
}

// 使用示例
@Composable
fun MyApp() {
    TopAppBarWithWebViewAndRefresh("https://www.example.com")
}



在这个示例中,我们使用了Scaffold来组织界面,TopAppBar中包含了一个刷新按钮(图标)。点击刷新按钮时,会调用webViewState?.reload()刷新WebView,同时更新isRefreshing状态来控制是否显示刷新指示器(如CircularProgressIndicator)。

请确保将"YOUR_COOKIE_STRING"替换为实际的Cookie值,并且遵循所有相关的隐私和安全规范。







GPT-4o


import android.os.Bundle
import android.webkit.WebView
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.google.accompanist.web.WebView
import com.google.accompanist.web.WebViewClient
import com.google.accompanist.web.rememberWebViewState

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApp()
        }
    }
}

@Composable
fun MyApp() {
    val initialUrl = "https://www.example.com"
    val webViewState = rememberWebViewState(url = initialUrl)
    val webView = remember { WebView(this).apply { webViewClient = WebViewClient() } }

    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = "WebView Example") },
                actions = {
                    IconButton(onClick = {
                        webViewState.reload()
                    }) {
                        Icon(Icons.Default.Refresh, contentDescription = "Refresh")
                    }
                }
            )
        }
    ) {
        WebView(
            state = webViewState,
            modifier = Modifier.fillMaxSize(),
            onCreated = { webView -> 
                webView.settings.javaScriptEnabled = true
            }
        )
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    MyApp()
}


解释

  1. 依赖配置:
  • 在 build.gradle 中添加了 Accompanist WebView 库的依赖。
  1. MainActivity.kt:
  • 使用 Scaffold 组件设置界面布局,包括一个 TopAppBar。
  • 使用 IconButton 添加一个刷新按钮,点击该按钮时调用 webViewState.reload() 来刷新WebView。
  • 使用 WebView 组件来显示网页内容,并设置 JavaScript 支持。
  1. Compose UI:
  • MyApp Composable 中,定义了一个 WebViewState 和 WebView。
  • 使用 TopAppBar 设置标题和动作按钮。
  • IconButton 设置刷新按钮,点击时调用 webViewState.reload() 刷新 WebView。
  1. 预览:
  • 使用 DefaultPreview Composable 预览布局效果。

通过上述代码,你可以使用 Jetpack Compose 在一个 Android 应用中嵌入一个 WebView,并在 TopAppBar 的右上角添加一个刷新按钮。点击按钮可以刷新 WebView 中显示的网页。请根据具体需求进一步调整和优化代码。








文心一言


import android.webkit.WebView  
import android.webkit.WebViewClient  
import androidx.activity.ComponentActivity  
import androidx.activity.compose.setContent  
import androidx.compose.foundation.layout.*  
import androidx.compose.runtime.Composable  
import androidx.compose.runtime.mutableStateOf  
import androidx.compose.runtime.remember  
import androidx.compose.ui.Alignment  
import androidx.compose.ui.Modifier  
import androidx.compose.ui.platform.ComposeView  
import androidx.compose.ui.platform.LocalContext  
import androidx.compose.ui.res.painterResource  
import androidx.compose.ui.tooling.preview.Preview  
import androidx.compose.ui.unit.dp  
import androidx.compose.ui.viewinterop.AndroidView  
import com.google.accompanist.appbar.TopAppBar  
import com.google.accompanist.insets.navigationBarsPadding  
  
@Composable  
fun WebViewScreen() {  
    val webView = remember { WebView(LocalContext.current) }  
  
    // 初始化 WebView(例如加载 URL)  
    webView.webViewClient = object : WebViewClient() {  
        override fun onPageFinished(view: WebView?, url: String?) {  
            super.onPageFinished(view, url)  
            // 页面加载完成的代码  
        }  
    }  
  
    webView.loadUrl("http://www.example.com")  
  
    var refreshButtonClicked by remember { mutableStateOf(false) }  
  
    // 刷新 WebView 的函数  
    fun refreshWebView() {  
        webView.reload()  
    }  
  
    Scaffold(  
        topBar = {  
            TopAppBar(  
                title = { Text("WebView") },  
                actions = {  
                    IconButton(onClick = { refreshButtonClicked = true; if (refreshButtonClicked) refreshWebView() }) {  
                        Icon(painter = painterResource(id = /* 刷新图标的资源ID */), contentDescription = "Refresh")  
                    }  
                },  
                modifier = Modifier  
                    .fillMaxWidth()  
                    .navigationBarsPadding()  
            )  
        },  
        content = {  
            Box(  
                modifier = Modifier  
                    .fillMaxSize()  
                    .padding(16.dp)  
            ) {  
                AndroidView(  
                    factory = { context -> webView },  
                    modifier = Modifier.fillMaxSize()  
                )  
            }  
        }  
    )  
}  
  
class MainActivity : ComponentActivity() {  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContent {  
            WebViewScreen()  
        }  
    }  
}


注意:

  • 你需要为刷新按钮提供一个图标资源ID。
  • AndroidView 用于在 Compose 中嵌入 WebView。
  • TopAppBar 的 actions 参数用于放置右上角的按钮。
  • 使用 mutableStateOf 和 remember 来跟踪按钮的点击状态(虽然在这个例子中我们实际上并不需要这个状态,但为了展示如何使用这些概念,我还是保留了它)。
  • 你可以根据需要调整布局和样式。




相关文章
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
969 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
780 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
975 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
746 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
5月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
287 0
|
9月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
429 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
497 1
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
822 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
529 1
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
310 4

热门文章

最新文章