Anonymous
Проблема отображает контент в WebVew внутри IndestedScrollView - если удалить вложенную strestedscrollview его рабочее п
Сообщение
Anonymous » 18 фев 2025, 19:05
Я должен загрузить HTML -контент в WebView внутри вложенного ScrollView, но Wehn я загружаю контент, некоторые из контента исчезают и отображают пробел. Белый экран и содержимое копирования копируются в буфер обмена. < /p>
Код: Выделить всё
< /code>
ниже мой код Java < /p>
package com.tops.webviewgs
import android.R
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.webkit.ConsoleMessage
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebView.setWebContentsDebuggingEnabled
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.NestedScrollView
import com.tops.webviewgs.databinding.ActivityMainBinding
import java.io.BufferedReader
import java.io.InputStreamReader
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val htmlContent = readHtmlFromAssets(this, "news.html")
loadDetailsDataIntoWebview(binding.webview, htmlContent, 0)
}
fun readHtmlFromAssets(context: Context, fileName: String): String {
return try {
val inputStream = context.assets.open(fileName)
val reader = BufferedReader(InputStreamReader(inputStream))
val stringBuilder = StringBuilder()
var line: String?
while (reader.readLine().also { line = it } != null) {
stringBuilder.append(line).append("\n")
}
reader.close()
stringBuilder.toString()
} catch (e: Exception) {
e.printStackTrace()
"Error reading file"
}
}
private fun loadDetailsDataIntoWebview(
wvNewsDetail: WebView?,
articleContent: String,
from: Int
) {
wvNewsDetail?.apply {
// WebView settings
// clearHistory()
// clearCache(true)
settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
defaultFontSize = 20
loadWithOverviewMode = true
useWideViewPort = false
databaseEnabled = true
loadsImagesAutomatically = true
cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
mediaPlaybackRequiresUserGesture = true
layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
offscreenPreRaster = true
allowFileAccess = true
allowContentAccess = true
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mixedContentMode = 0;
setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
}
// Prevent WebView from being reset
isVerticalScrollBarEnabled = true
overScrollMode = WebView.OVER_SCROLL_NEVER
scrollBarStyle = View.SCROLLBARS_INSIDE_INSET
webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
val blockedUrls = listOf(
"ads.js",
"tracking.js",
"some-script.js"
) // Add problematic scripts here
if (request?.url.toString().contains(blockedUrls.toString())) {
Log.e("WEBVIEW", "Blocked script: ${request?.url}")
return WebResourceResponse("text/plain", "utf-8", null) // Block the script
}
return super.shouldInterceptRequest(view, request)
}
@Deprecated("Deprecated in Java")
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
return false
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
}
override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
}
}
webChromeClient = object : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
consoleMessage?.message()?.let {
Log.e("JS_ERROR", it)
}
return true
}
}
setOnKeyListener(object : View.OnKeyListener {
override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean {
if (event.action != KeyEvent.ACTION_DOWN) {
when (event.keyCode) {
KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN -> // Handle volume key events as needed
return true // Consume the event
}
}
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (canGoBack()) {
goBack()
return true
} else {
Log.e(
"WEBVIEW",
"BACK PRESSED")
return true
}
}
return false
}
})
setWebContentsDebuggingEnabled(true)
loadDataWithBaseURL("about:blank", articleContent, "text/html", "UTF-8", null)
// loadUrl("file:///android_asset/news.html")
}
}
}
Вот вывод, который я получил из кода
Подробнее здесь:
https://stackoverflow.com/questions/794 ... -nestedscr
1739894755
Anonymous
Я должен загрузить HTML -контент в WebView внутри вложенного ScrollView, но Wehn я загружаю контент, некоторые из контента исчезают и отображают пробел. Белый экран и содержимое копирования копируются в буфер обмена. < /p> [code] < /code> ниже мой код Java < /p> package com.tops.webviewgs import android.R import android.content.Context import android.graphics.Bitmap import android.os.Build import android.os.Bundle import android.util.Log import android.view.KeyEvent import android.view.MotionEvent import android.view.View import android.webkit.ConsoleMessage import android.webkit.WebChromeClient import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebView.setWebContentsDebuggingEnabled import android.webkit.WebViewClient import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.NestedScrollView import com.tops.webviewgs.databinding.ActivityMainBinding import java.io.BufferedReader import java.io.InputStreamReader class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val htmlContent = readHtmlFromAssets(this, "news.html") loadDetailsDataIntoWebview(binding.webview, htmlContent, 0) } fun readHtmlFromAssets(context: Context, fileName: String): String { return try { val inputStream = context.assets.open(fileName) val reader = BufferedReader(InputStreamReader(inputStream)) val stringBuilder = StringBuilder() var line: String? while (reader.readLine().also { line = it } != null) { stringBuilder.append(line).append("\n") } reader.close() stringBuilder.toString() } catch (e: Exception) { e.printStackTrace() "Error reading file" } } private fun loadDetailsDataIntoWebview( wvNewsDetail: WebView?, articleContent: String, from: Int ) { wvNewsDetail?.apply { // WebView settings // clearHistory() // clearCache(true) settings.apply { javaScriptEnabled = true domStorageEnabled = true defaultFontSize = 20 loadWithOverviewMode = true useWideViewPort = false databaseEnabled = true loadsImagesAutomatically = true cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK mediaPlaybackRequiresUserGesture = true layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE offscreenPreRaster = true allowFileAccess = true allowContentAccess = true if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mixedContentMode = 0; setLayerType(View.LAYER_TYPE_HARDWARE, null); } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } // Prevent WebView from being reset isVerticalScrollBarEnabled = true overScrollMode = WebView.OVER_SCROLL_NEVER scrollBarStyle = View.SCROLLBARS_INSIDE_INSET webViewClient = object : WebViewClient() { override fun shouldInterceptRequest( view: WebView?, request: WebResourceRequest? ): WebResourceResponse? { val blockedUrls = listOf( "ads.js", "tracking.js", "some-script.js" ) // Add problematic scripts here if (request?.url.toString().contains(blockedUrls.toString())) { Log.e("WEBVIEW", "Blocked script: ${request?.url}") return WebResourceResponse("text/plain", "utf-8", null) // Block the script } return super.shouldInterceptRequest(view, request) } @Deprecated("Deprecated in Java") override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { return false } override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) } override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) } } webChromeClient = object : WebChromeClient() { override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { consoleMessage?.message()?.let { Log.e("JS_ERROR", it) } return true } } setOnKeyListener(object : View.OnKeyListener { override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean { if (event.action != KeyEvent.ACTION_DOWN) { when (event.keyCode) { KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN -> // Handle volume key events as needed return true // Consume the event } } if (keyCode == KeyEvent.KEYCODE_BACK) { if (canGoBack()) { goBack() return true } else { Log.e( "WEBVIEW", "BACK PRESSED") return true } } return false } }) setWebContentsDebuggingEnabled(true) loadDataWithBaseURL("about:blank", articleContent, "text/html", "UTF-8", null) // loadUrl("file:///android_asset/news.html") } } } [/code] Вот вывод, который я получил из кода Подробнее здесь: [url]https://stackoverflow.com/questions/79448905/issue-displaying-content-in-webvew-inside-nestedscrollview-if-remove-nestedscr[/url]