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
,但它不是一个函数类型?
- Android / Kotlin崩溃在开始4.1.2 – ExceptionInInitializerError
- 使用Kotlin进行数据绑定会导致Resources $ NotFoundException
- 尝试使用Android Studio生成Kotlin应用程序的问题
- kotlin +特浓咖啡:找不到活动
- 在Android Studio中将代码从Java转换为Kotlin
- 配置kotlin插件更新失败?
- 在Kotlin中,表达式不能是一个选择符(出现在一个点之后)
- 错误:将字节码转换为dex时出错:原因:com.android.dex.DexException:多个dex文件定义了Lorg / jetbrains / anko / collections / CollectionsKt;
- Android Studio,Kotlin:上传图片并显示