我可以在 Android-Kotlin 中的 Listener Lambda 中调用 super 吗?



我正在尝试覆盖WebView的下载侦听器,以便它可以在外部浏览器中打开不属于我们的网站,而不是在Web视图中加载它们。问题是,我想将代码简化成这样的东西

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.onDownloadStart

它给出了一个unresolved reference error.

当 url 是我们域的一部分时,如何让 webview 监听器照常开展业务?超级调用是否仅在非 lambda 方法中可用?

经过多次测试,@Demigod的方法被证明是正确的。它只需要同时拥有已弃用和当前的方法应该OverrideUrlLoad,如此处找到

// 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)
}

最新更新