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 来跟踪按钮的点击状态(虽然在这个例子中我们实际上并不需要这个状态,但为了展示如何使用这些概念,我还是保留了它)。
  • 你可以根据需要调整布局和样式。




相关文章
|
9月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1708 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
9月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1105 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
9月前
|
人工智能 前端开发 JavaScript
最佳实践3:用通义灵码开发一款 App
本示例演示使用通义灵码,基于React Native与Node.js开发跨平台类通义App,重点展示iOS端实现。涵盖前端页面生成、后端代码库自动生成、RTK Query通信集成及Qwen API调用全过程,体现灵码在全栈开发中的高效能力。(238字)
966 11
|
9月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
424 0
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
|
JavaScript 前端开发 Android开发
android开发,使用kotlin学习WebView(详细)
android开发,使用kotlin学习WebView(详细)
1222 0
|
JavaScript 前端开发 Android开发
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
|
Android开发 前端开发
Android开发之WebView
感觉在显示信息时,用途还可以的。 只是不知和React Native的应用场合有何分别?
1854 0
|
XML JavaScript Android开发
安卓开发学习笔记(五):史上最简单且华丽地实现Android Stutio当中Webview控件https/http协议的方法
一.我们先在XML当中自定义一个webview(Second_layout.xml) 代码如下: 1 2 10 15 可以看到,这里我们使用了现行布局以及WebView控件,tools:context=".SecondActivity"告诉我们这个控件是定义在第二个主活动当中的。
1615 0
|
Web App开发 移动开发 JavaScript
Android与H5混合开发「kotlin,WebView」
Android与H5的交互「kotlin,WebView」 文章参考自尚硅谷-Android与H5的互调,由衷感谢。语言是使用了kotlin,如果不熟悉kotlin,建议看看这篇文章,kotlin还是很值得学习的。
2504 0