Advertisement

Responsive Advertisement

WebView in Jetpack Compose in android Studio

  •  Paste this code in a screen


import android.graphics.Bitmap
import android.util.Log
import android.webkit.WebChromeClient
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView

@Composable
fun WebBrowser() {
var url by remember { mutableStateOf("https://stevdza-san.com") }
var currentUrl by remember { mutableStateOf(url) }
var isLoading by remember { mutableStateOf(false) }
var progress by remember { mutableFloatStateOf(0f) }
var errorOccurred by remember { mutableStateOf(false) }

var webViewRef by remember { mutableStateOf<WebView?>(null) } // To hold the WebView reference

Column {
TopAppBar {
IconButton(onClick = { webViewRef?.goBack() }, enabled = webViewRef?.canGoBack() == true) {
Icon(
imageVector = Icons.Default.ArrowBack,
contentDescription = "Back"
)
}
IconButton(onClick = { webViewRef?.goForward() }, enabled = webViewRef?.canGoForward() == true) {
Icon(
imageVector = Icons.Default.ArrowForward,
contentDescription = "Forward"
)
}
Text(
text = "Web Browser",
style = TextStyle(
color = Color.White,
fontSize = MaterialTheme.typography.h6.fontSize,
fontWeight = MaterialTheme.typography.h6.fontWeight
)
)
Row(
modifier = Modifier.weight(1f),
horizontalArrangement = Arrangement.End
) {
IconButton(onClick = { webViewRef?.reload() }) {
Icon(
imageVector = Icons.Default.Refresh,
contentDescription = "Refresh"
)
}
IconButton(onClick = { currentUrl = url }) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = "Go"
)
}
}
}

Row(modifier = Modifier.padding(all = 12.dp)) {
BasicTextField(
modifier = Modifier.weight(9f),
value = url,
onValueChange = { url = it },
maxLines = 1
)
if (errorOccurred) {
Icon(
modifier = Modifier.weight(1f),
imageVector = Icons.Default.Warning,
contentDescription = "Error",
tint = Color.Red
)
}
}

if (isLoading) {
LinearProgressIndicator(
progress = progress,
modifier = Modifier.fillMaxWidth()
)
}

val context = LocalContext.current
AndroidView(
factory = { context ->
WebView(context).apply {
settings.javaScriptEnabled = true
webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) {
isLoading = true
errorOccurred = false
Log.d("WebView", "Page started loading for $url")
}

override fun onPageFinished(view: WebView, url: String?) {
isLoading = false
progress = 1f
}

override fun onReceivedError(
view: WebView,
request: WebResourceRequest,
error: WebResourceError
) {
errorOccurred = true
Log.e("WebView", "Error loading page: ${error.description}")
}
}
webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView, newProgress: Int) {
progress = newProgress / 100f
}
}
loadUrl(currentUrl)
webViewRef = this // Save the WebView reference
}
},
update = { webView ->
if (webView.url != currentUrl) {
webView.loadUrl(currentUrl)
}
},
modifier = Modifier.weight(1f)
)
}
}

Post a Comment

0 Comments