Kotlin Load WebView 每次都无法正常工作

Posted

技术标签:

【中文标题】Kotlin Load WebView 每次都无法正常工作【英文标题】:Kotlin Load WebView is not working every time 【发布时间】:2021-11-25 14:51:51 【问题描述】:

我目前有一个通常应该显示轨迹图的 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 Response 加载,为 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" />
....

【问题讨论】:

【参考方案1】:

我的问题是,当我返回菜单屏幕时,我的 Webview 不会从窗口中分离出来......所以..解决方案是从我的窗口中分离 Webview 并重新加载......

我为此使用了 wv_map.destroy()...

也许有人会有类似的错误。

【讨论】:

以上是关于Kotlin Load WebView 每次都无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Webview 将对象从 Javascript 发送到 Kotlin

如何使用 Android Kotlin 在 WebView 中加载 URL?

Android Kotlin WebView NullPointerException

android中通过kotlin使用WebView

使用 Kotlin 的 Android Studio WebView“期望成员声明”

spotify models.player.load(...) 承诺无法解决