Android WebView с прозрачным наложением в ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android WebView с прозрачным наложением в Compose

Сообщение Anonymous »

У меня есть немодальный BottomSheet с WebView в Compose с использованием AndroidView.
WebView показывает сайт Google Map, и я использую параметры, чтобы показать местоположение, полученное с помощью FusedLocationProviderClient и другие.
Я хочу отключить взаимодействие пользователя с WebView и прочитал здесь два предложения: добавить наложение или переопределить события касания. Но это действительно старая тема, и я не знаю, как реализовать какие-либо предложения с помощью Compose внутри AndroidView.
Вот мой код:
Нижний лист:

Код: Выделить всё

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LocationScreen(startLocationUpdates: ()->Unit, context: Context, currentLocation: LatLng) {

val permissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
)

val launchMultiplePermissions = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissionMaps ->
val areGranted = permissionMaps.values.reduce { acc, next -> acc && next }
if (areGranted) {
locationRequired = true
startLocationUpdates()
Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show()
}
}

var readable by remember { mutableStateOf("") }
//val scope = rememberCoroutineScope()
//I HAVE THIS COMMENTED BECAUSE THE BUTTON THAT IS USUALLY LOCATED IN THE BOTTOMSHEET TO CLOSE IT IS COVER BY THE WEBVIEW AND CAN'T BE USED
val scaffoldState = rememberBottomSheetScaffoldState()

BottomSheetScaffold(
scaffoldState = scaffoldState,
sheetPeekHeight = 590.dp, //The Bottom Sheet will show the WebView partially but all that is needed
sheetSwipeEnabled = false, //For the  moment I don't want the Bottom Sheet to occupy the full screen
sheetContent = {

Column(
Modifier
.fillMaxWidth()
.padding(6.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
if (currentLocation.latitude != 0.toDouble() && currentLocation.longitude != 0.toDouble() && readable != "") {
WebViewScreen(location = currentLocation) //HERE IS THE CALL TO THE ANDROIDVIEW/WEBVIEW
} else {Text(text = "Please click [Get your location]")}
}
}) { innerPadding ->
Box(Modifier.padding(innerPadding)) {
Column(
modifier = Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "Your location: ${currentLocation.latitude}/${currentLocation.longitude}")
if (currentLocation.latitude != 0.toDouble() &&  currentLocation.longitude != 0.toDouble()) {
Text(
text = "Readable location: $currentLocation"
)
location = ""
readable = getReadableLocation(currentLocation.latitude, currentLocation.longitude, context) //HERE I USE A GEOCODER TO GET THE ADDRESS
glocation = currentLocation
}
Button(onClick = {
if (permissions.all {
ContextCompat.checkSelfPermission(
context,
it
) == PackageManager.PERMISSION_GRANTED
}) {
//Get Locations
startLocationUpdates() //THIS IS WHERE I GET THE LOCATION/COORDINATES
} else {
launchMultiplePermissions.launch(permissions)
}
//run = true
}) {
Text(text = "Get your location")
}
}
}
}
AndroidView с WebView:

Код: Выделить всё

@Composable
fun WebViewScreen(location: LatLng){

//val urladdress = URLDecoder.decode(address,"utf-8")
val url = "http://maps.google.com/maps?z=16&t=h&q=loc:${location.latitude}+${location.longitude}&hl=${Locale.getDefault().language}"

AndroidView(
factory = { context ->
WebView(context).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
settings.javaScriptEnabled = true
webViewClient = WebViewClient()

settings.loadWithOverviewMode = true
settings.useWideViewPort = true
settings.setSupportZoom(true)
loadUrl(url)
}
},
update = { webView ->
webView.loadUrl(url)
}
)
}
Я не предоставляю ни код местоположения, ни адрес, поскольку это не требуется для целей этого вопроса.

Подробнее здесь: https://stackoverflow.com/questions/777 ... in-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»