Android:Kotlin:自定义webView – 不能作为函数调用。 找不到函数“invoke()”

我有一个活动( ContactActivity.kt )只包含一个webView组件。 活动写在Kotlin上。

我想用我的自定义webView( ObservableWebView.java )替换webView。

所以这里代码( MyActivity.kt ):

class ContactActivity : AppCompatActivity() { @SuppressLint("NewApi") override fun onCreate(savedInstanceState: Bundle?) { verticalLayout { val observableWebView = object : ObservableWebView(MainApp.getAppContext()) observableWebView { // error here setOnLongClickListener(object : View.OnLongClickListener { override fun onLongClick(v: View): Boolean { return true } }) } } } } 

另外我有自定义的webView – ObservableWebView.java:

 public class ObservableWebView extends WebView { private OnScrollChangedCallback mOnScrollChangedCallback; public ObservableWebView(final Context context) { super(context); } public ObservableWebView(final Context context, final AttributeSet attrs) { super(context, attrs); } public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t); } public OnScrollChangedCallback getOnScrollChangedCallback() { return mOnScrollChangedCallback; } public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) { mOnScrollChangedCallback = onScrollChangedCallback; } /** * Impliment in the activity/fragment/view that you want to listen to the webview */ public static interface OnScrollChangedCallback { public void onScroll(int l, int t); } } 

但我在MyActivity.kt中得到编译错误:

 Error:(145, 13) Expression 'observableWebView' of type '<no name provided>' cannot be invoked as a function. The function 'invoke()' is not found 

您可以扩展Anko以支持您的自定义视图与这样一个扩展功能(请参阅文档在这里 ):

 inline fun ViewManager.observableWebView(theme: Int = 0, init: ObservableWebView.() -> Unit): ObservableWebView { return ankoView({ ObservableWebView(it) }, theme, init) } 

然后创建一个并设置一个监听器将如下所示:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) verticalLayout { observableWebView { setOnLongClickListener { Log.d("WEBVIEW", "on long click") true } onLongClick { Log.d("WEBVIEW", "on long click") } } } } 

这段代码显示了不同的方法来创建长按听者,当然你不需要两个。

第一个是经典的方法,它使用WebViewsetOnLongClickListener函数和SAM转换来创建一个带有lambda的侦听器实例。 你必须在这里返回一个布尔值来表示你是否处理了事件,或者你想传播它。

第二种方法,使用onLongClick是一种与onLongClick做的方法。 在0.10.0以上,这将使用协程。 在这里,你没有选择返回一个布尔值。


或者,如果您希望能够使用observableWebView()语法,则可以创建另一个委托给此先前扩展的扩展:

 inline fun ViewManager.observableWebView() = observableWebView {} 

为什么不打电话

 observableWebView.setOnLongClickListener 

它看起来像你试图“调用”一个方法observableWebView ,但它不是一个函数类型?