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") } } } }
这段代码显示了不同的方法来创建长按听者,当然你不需要两个。
第一个是经典的方法,它使用WebView
的setOnLongClickListener
函数和SAM转换来创建一个带有lambda的侦听器实例。 你必须在这里返回一个布尔值来表示你是否处理了事件,或者你想传播它。
第二种方法,使用onLongClick
是一种与onLongClick
做的方法。 在0.10.0
以上,这将使用协程。 在这里,你没有选择返回一个布尔值。
或者,如果您希望能够使用observableWebView()
语法,则可以创建另一个委托给此先前扩展的扩展:
inline fun ViewManager.observableWebView() = observableWebView {}
为什么不打电话
observableWebView.setOnLongClickListener
它看起来像你试图“调用”一个方法observableWebView
,但它不是一个函数类型?