gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:26:35 25 4
gpt4 key购买 nike

我的一项 Activity (ContactActivity.kt) 仅包含一个 webView 组件。在 Kotlin 上编写 Activity 。

我想用我的自定义 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 以支持您的自定义 View ,使用像这样的扩展函数(参见文档 here):

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 conversion使用 lambda 创建一个监听器实例。您必须在此处返回一个 bool 值以指示您是否已处理该事件,或者您希望它传播。

第二种方法,使用onLongClick 是一种用Anko 实现的方法。在 0.10.0 以上,这将使用协程。在这里,您没有返回 bool 值的选项。


可选地,如果您还希望能够使用 observableWebView() 语法,您可以创建另一个委托(delegate)给之前的扩展的扩展:

inline fun ViewManager.observableWebView() = observableWebView {}

关于Android:Kotlin:自定义 webView - 不能作为函数调用。找不到函数 'invoke()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45255458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com