Могу ли я позвонить супер в Лямбда Слушателя в Android - Kotlin? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь переопределить загрузку Listener для WebView, чтобы он открывал веб-сайты, не принадлежащие нам, во внешнем браузере, а не загружал их в веб-просмотре. Дело в том, что я хотел бы упростить код до чего-то подобного

webView?.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
        if (!url.contains("mydomain")) {
            CLog.v("InternalWebviewFragment.configWebView().setDownloadListener() isNOTmydomain url: $url")
            val i = Intent(Intent.ACTION_VIEW, Uri.parse(url))
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            activity?.startActivity(i)

        }else{
            super(url, userAgent, contentDisposition, mimetype, contentLength)
        }
    }

Однако тот вызов super там, который я собираюсь сделать для URL-адресов, принадлежащих нашему домену, говорит, что может только использоваться на левой руке точки. Когда я пытаюсь набрать

super.onDownloadStart

, это дает unresolved reference error.

Как я могу получить прослушиватель веб-просмотра на go в обычном режиме, когда URL-адрес является частью нашего домена ? Доступен ли супер-вызов только в не-лямбда-методах?

1 Ответ

0 голосов
/ 13 февраля 2020

После многих испытаний подход @ Demigod оказался верным. Ему просто нужно было иметь как устаревшие, так и текущие методы shouldOverrideUrlLoading, найденные здесь

        // APIs up to 23 need this method
        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
            if (!url.contains("mydomain")) {
                // InternalWebviewFragment external (non mydomain) urls will be dispatched to an external browser
                CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoadingOLD() isNotmydomain url: $url")
                val i = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                activity?.startActivity(i)
                CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoadingOLD() isNotmydomain  After Intent")
                return true //InternalWebviewFragment this avoids the webview to load the url we've just sent to the browser
            }
            CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoadingOLD() ismydomain url: $url")
            // mydomain urls should load fine in the webview
            view?.loadUrl(url)
            return super.shouldOverrideUrlLoading(view, url)

        }
        // for APIs 24+
        override fun shouldOverrideUrlLoading(
            view: WebView?,
            request: WebResourceRequest?
        ): Boolean {
            if (!request?.url.toString().contains("mydomain")) {
                // InternalWebviewFragment external (non mydomain) urls will be dispatched to an external browser
                CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoading2() isNotmydomain url: ${request?.url.toString()}")
                val i = Intent(Intent.ACTION_VIEW, Uri.parse(request?.url.toString()))
                activity?.startActivity(i)
                CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoading2() isNotmydomain After Intent")
                return true //InternalWebviewFragment this avoids the webview to load the url we've just sent to the browser
            }
            CLog.v("InternalWebviewFragment.getSimpleWebViewClientUrlLoading().shouldOverrideUrlLoading() ismydomain url: $url")
            // mydomain urls should load fine in the webview
            view?.loadUrl(request?.url.toString())
            return super.shouldOverrideUrlLoading(view, request)
        }
...