Kotlin Load WebView 并非每次都有效
Kotlin Load WebView is not working every time
我目前有一个通常应显示轨迹图的 WebView。在模拟器上它每次都可以工作,但在物理设备上它有时可以工作,有时它只显示黑色背景。我现在已经阅读了很多答案,但没有一个真正解决我的问题。
这是我的MapActivity.kt,我的地图逻辑就在里面。
@SuppressLint("WrongViewCast")
class MapActivity : AppCompatActivity() {
private val TAG = "MapActivity"
val args: MapActivityArgs by navArgs()
var mMap: String? = null
private lateinit var pb: ProgressBar
//Progress bar when initialize the SVG file.
fun initProgressDialog() {
Log.d(TAG,"LOADED!")
pb = ProgressBar(this)
pb.isIndeterminate = true
}
override public fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)
Log.d(TAG, "onCreate: "+args.map)
this.mMap = args.map
// TODO: 30.09.2021 Do something with me
Log.d(TAG, "onCreate: "+SimplePossession.State.valueOf(args.possessionState))
setupButtonActions()
setupWebLayout()
}
/** Setup the Action Buttons
* btn_plus = ZoomIn for map
* btn_minus = ZoomOut for map
* btn_back = btn to go back to possession
* btn_confirm = btn to confirm map section
*/
fun setupButtonActions() {
initProgressDialog()
btn_plus.setOnClickListener{
Log.e("Btn", "BtnZoomIN")
wv_map.zoomIn() }
btn_minus.setOnClickListener {
Log.e("Btn","BtnZoomOUT")
wv_map.zoomOut() }
btn_back.setOnClickListener{
Log.e("Btn","Btn back")
onBackPressed();
}
btn_confirm.setOnClickListener {
/** If possessionDetailsFragment variable set on true, means possession has
* state: start approved or started
* click on confirm btn set checkbox on true and return on PossessionDetails View
*/
PossessionAreaTableEntryViewHolder.setCheckedCB(true);
onBackPressed();
}
}
override fun onResume() {
super.onResume()
callVM()
}
fun callVM() {
try {
var apiResponse : String? = ""
try{
apiResponse = mMap
} catch(e: Exception){
e.printStackTrace()
}
if (apiResponse != null) {
Log.d(TAG, "callVM: TEEEEEEEEEEEEEEEEEEEEEEEEEEST")
wv_map.loadData(Base64.encodeToString(apiResponse.toByteArray(StandardCharsets.UTF_8), Base64.DEFAULT),
"text/html; charset=utf-8", "base64")
}
} catch (e: Exception) {
Log.e("FAIL", "Initializing failed")
e.printStackTrace()
}
}
@SuppressLint("AddJavascriptInterface", "SetJavaScriptEnabled")
fun setupWebLayout() {
wv_map.clearView()
wv_map.setInitialScale(150)
wv_map.settings.loadsImagesAutomatically = true
wv_map.settings.builtInZoomControls = true
wv_map.settings.displayZoomControls = false
wv_map.settings.javaScriptEnabled = true
wv_map.settings.domStorageEnabled = true
wv_map.webChromeClient = WebChromeClient()
}
override fun onDestroy() {
super.onDestroy()
}
}
地图将通过 API 响应加载,并采用 html 格式。我仔细检查了我的 MapActivity 是否真的收到了 html 格式的地图 - 它收到了。奇怪的是,背景每次都加载正确(它只是一个黑色背景,顶部通常有轨道,但轨道不会每次都加载)...
我的想法是缓存问题,所以我尝试在再次读取地图之前清除缓存。不能解决我的问题。
然后在重新加载地图之前清除整个地图变量。没有解决我的问题。
我没有解决此问题的其他想法,所以我希望这里有人有想法:)
编辑:已授予 AndroidManifest 中的权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.siemens.poms">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.INTERNET" />
....
我的问题是,当我返回到我的菜单屏幕时,我的 Webview 不会与 window 分离...所以..解决方案是将 Webview 从我的 [=17= 分离] 并重新加载...
我为此使用了 wv_map.destroy()...
也许有人会出现类似的错误。
我目前有一个通常应显示轨迹图的 WebView。在模拟器上它每次都可以工作,但在物理设备上它有时可以工作,有时它只显示黑色背景。我现在已经阅读了很多答案,但没有一个真正解决我的问题。
这是我的MapActivity.kt,我的地图逻辑就在里面。
@SuppressLint("WrongViewCast")
class MapActivity : AppCompatActivity() {
private val TAG = "MapActivity"
val args: MapActivityArgs by navArgs()
var mMap: String? = null
private lateinit var pb: ProgressBar
//Progress bar when initialize the SVG file.
fun initProgressDialog() {
Log.d(TAG,"LOADED!")
pb = ProgressBar(this)
pb.isIndeterminate = true
}
override public fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)
Log.d(TAG, "onCreate: "+args.map)
this.mMap = args.map
// TODO: 30.09.2021 Do something with me
Log.d(TAG, "onCreate: "+SimplePossession.State.valueOf(args.possessionState))
setupButtonActions()
setupWebLayout()
}
/** Setup the Action Buttons
* btn_plus = ZoomIn for map
* btn_minus = ZoomOut for map
* btn_back = btn to go back to possession
* btn_confirm = btn to confirm map section
*/
fun setupButtonActions() {
initProgressDialog()
btn_plus.setOnClickListener{
Log.e("Btn", "BtnZoomIN")
wv_map.zoomIn() }
btn_minus.setOnClickListener {
Log.e("Btn","BtnZoomOUT")
wv_map.zoomOut() }
btn_back.setOnClickListener{
Log.e("Btn","Btn back")
onBackPressed();
}
btn_confirm.setOnClickListener {
/** If possessionDetailsFragment variable set on true, means possession has
* state: start approved or started
* click on confirm btn set checkbox on true and return on PossessionDetails View
*/
PossessionAreaTableEntryViewHolder.setCheckedCB(true);
onBackPressed();
}
}
override fun onResume() {
super.onResume()
callVM()
}
fun callVM() {
try {
var apiResponse : String? = ""
try{
apiResponse = mMap
} catch(e: Exception){
e.printStackTrace()
}
if (apiResponse != null) {
Log.d(TAG, "callVM: TEEEEEEEEEEEEEEEEEEEEEEEEEEST")
wv_map.loadData(Base64.encodeToString(apiResponse.toByteArray(StandardCharsets.UTF_8), Base64.DEFAULT),
"text/html; charset=utf-8", "base64")
}
} catch (e: Exception) {
Log.e("FAIL", "Initializing failed")
e.printStackTrace()
}
}
@SuppressLint("AddJavascriptInterface", "SetJavaScriptEnabled")
fun setupWebLayout() {
wv_map.clearView()
wv_map.setInitialScale(150)
wv_map.settings.loadsImagesAutomatically = true
wv_map.settings.builtInZoomControls = true
wv_map.settings.displayZoomControls = false
wv_map.settings.javaScriptEnabled = true
wv_map.settings.domStorageEnabled = true
wv_map.webChromeClient = WebChromeClient()
}
override fun onDestroy() {
super.onDestroy()
}
}
地图将通过 API 响应加载,并采用 html 格式。我仔细检查了我的 MapActivity 是否真的收到了 html 格式的地图 - 它收到了。奇怪的是,背景每次都加载正确(它只是一个黑色背景,顶部通常有轨道,但轨道不会每次都加载)...
我的想法是缓存问题,所以我尝试在再次读取地图之前清除缓存。不能解决我的问题。 然后在重新加载地图之前清除整个地图变量。没有解决我的问题。
我没有解决此问题的其他想法,所以我希望这里有人有想法:)
编辑:已授予 AndroidManifest 中的权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.siemens.poms">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.INTERNET" />
....
我的问题是,当我返回到我的菜单屏幕时,我的 Webview 不会与 window 分离...所以..解决方案是将 Webview 从我的 [=17= 分离] 并重新加载...
我为此使用了 wv_map.destroy()...
也许有人会出现类似的错误。