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

时间:2017-07-22 14:06:42

标签: android kotlin

我有一个只包含一个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

2 个答案:

答案 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上的方法,但它不是函数类型?