我有一个只包含一个webView组件的活动( ContactActivity.kt )。活动写在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
答案 0 :(得分:1)
您可以使用此扩展功能扩展Anko以支持您的自定义视图(请参阅文档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")
}
}
}
}
此代码展示了创建长时间点击监听器的不同方法,当然您不需要两者。
第一种是经典方式,它使用WebView
的{{1}}函数,SAM conversion创建一个带lambda的侦听器实例。您必须在此处返回一个布尔值,以指示您是否已处理该事件,或者您希望它传播。
第二种方式,使用setOnLongClickListener
是一种使用Anko的方法。高于onLongClick
,这将使用协同程序。在这里,你没有得到返回布尔值的选项。
或者,如果您希望能够使用0.10.0
语法,则可以创建另一个委托给此前一个扩展程序的扩展程序:
observableWebView()
答案 1 :(得分:0)
为什么不打电话
observableWebView.setOnLongClickListener
看起来你试图“调用”observableWebView
上的方法,但它不是函数类型?