首页 > 解决方案 > kotlin如何使用新的webView打开一个javascript的window.open

问题描述

我参考了这个,我想在遇到时打开一个新的 webView window.open。我尝试使用硬代码打开 Google 页面,这是我的代码

class MainActivity : AppCompatActivity() {

    private var myWebView: WebView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myWebView = findViewById(R.id.webview)
        myWebView!!.settings.javaScriptEnabled = true
        myWebView!!.settings.domStorageEnabled = true
        myWebView!!.settings.setSupportMultipleWindows(true)
        myWebView!!.settings.javaScriptCanOpenWindowsAutomatically = true

        myWebView!!.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                view?.loadUrl(url)
                return true
            }
        }

        myWebView!!.webChromeClient = object : WebChromeClient() {
            ....

            override fun onCreateWindow(
                view: WebView,
                dialog: Boolean,
                userGesture: Boolean,
                resultMsg: android.os.Message
            ): Boolean {
                var cookieValues: HashMap<String, String> = _parseCookie(view.url)
                var tokenData: HashMap<String, String> = HashMap()
                val newWebView = WebView(view.context)
                view.addView(newWebView)

                newWebView.settings.javaScriptEnabled = true
                newWebView.settings.setSupportZoom(true)
                newWebView.settings.builtInZoomControls = true
                newWebView.settings.setSupportMultipleWindows(true)

                val transport = resultMsg.obj as WebView.WebViewTransport
                transport.webView = newWebView
                resultMsg.sendToTarget()

                newWebView.webViewClient = object : WebViewClient(){
                    override fun shouldOverrideUrlLoading(
                        view: WebView, url: String
                    ): Boolean {
                        view.loadUrl("https://www.google.com")
                        return true
                    }
                }

                return true    
            }
        }

        myWebView!!.loadUrl("http://www.example.com")
    }

    .... 
}

它的工作,但新的 webView 大小没有满屏,我点击搜索输入,这个应用程序关闭,我收到了这条消息。

E/EGL_emulation: tid 8491: eglSurfaceAttrib(1354): error 0x3009 (EGL_BAD_MATCH)
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xd623bbc0, error=EGL_BAD_MATCH
W/cr_AwAutofillManager: Application attempted to call on a destroyed AwAutofillManager
    java.lang.Throwable
        at org.chromium.android_webview.AwAutofillManager.checkAndWarnIfDestroyed(AwAutofillManager.java:18)
        at org.chromium.android_webview.AwAutofillProvider.startAutofillSession(AwAutofillProvider.java:98)
        at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
        at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:9)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
W/cr_AwAutofillManager: Application attempted to call on a destroyed AwAutofillManager
    java.lang.Throwable
        at org.chromium.android_webview.AwAutofillManager.checkAndWarnIfDestroyed(AwAutofillManager.java:18)
        at org.chromium.android_webview.AwAutofillManager.notifyVirtualViewEntered(AwAutofillManager.java:11)
        at org.chromium.android_webview.AwAutofillProvider.startAutofillSession(AwAutofillProvider.java:103)
        at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
        at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:9)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这是我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

我该如何解决?谢谢你的帮助。

标签: androidkotlinandroid-webview

解决方案


这对我有用,我需要设置layoutParams为新的 webView。所以我重用了原来的视图布局。

newWebView.layoutParams = view.layoutParams

推荐阅读