相关疑难解决方法(0)

冗余SAM构造函数不能为Kotlin声明的函数删除,但适用于Java声明的函数

我有一个Java类函数如下

public void setPositiveButton(int resId, DialogInterface.OnClickListener listener) 
Run Code Online (Sandbox Code Playgroud)

我也有如下的Kotlin类功能

fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
Run Code Online (Sandbox Code Playgroud)

当我从Kotlin代码中调用它们时

    javaClassObj.setPositiveButton(R.string.some_string,
            DialogInterface.OnClickListener { _, _ -> someFunc()})

    kotlinClassObj.setPositiveButton(R.string.some_string,
            DialogInterface.OnClickListener { _, _ -> someFunc()})
Run Code Online (Sandbox Code Playgroud)

可以减少Java类函数调用,但不能减少Kotlin类函数

    javaClassObj.setPositiveButton(R.string.some_string,
            { _, _ -> someFunc()})

    kotlinClassObj.setPositiveButton(R.string.some_string,
            DialogInterface.OnClickListener { _, _ -> someFunc()})
Run Code Online (Sandbox Code Playgroud)

为什么Kotlin函数调用不能根据Java启用减少冗余的SAM-Constructor?

java kotlin

7
推荐指数
1
解决办法
5721
查看次数

Android - Kotlin - 对象必须声明为abstract或实现抽象成员

我为我的RecyclerView设置了一个ItemClickLister,如下所示:

ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener(
                    object : ItemClickSupport.OnItemClickListener {
                        override fun onItemClicked(recyclerView: RecyclerView?, position: Int, v: View?) {
                            val row = recyclerView!!.getChildAt(position)
                            val el = row.findViewById(R.id.active_expandablelayout) as ExpandableLayout

                            if (el.isExpanded) {
                                el.collapse()
                            } else {
                                el.expand()
                            }
                        }
                    }
            )
Run Code Online (Sandbox Code Playgroud)

使用我翻译成Kotlin的ItemClickSupport库.

我在object(第2行)上收到错误消息:

object必须声明为abstract或实现抽象成员.

我是Kotlin的新手,我也找不到任何解决方案.

任何帮助是极大的赞赏.

编辑:

这是我的ItemClickSupport.kt:

class ItemClickSupport private constructor(private val mRecyclerView: RecyclerView) {
    private var mOnItemClickListener: OnItemClickListener? = null
    private var mOnItemLongClickListener: OnItemLongClickListener? = null
    private val mOnClickListener = View.OnClickListener { v ->
        if (mOnItemClickListener != null) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-recyclerview

6
推荐指数
1
解决办法
4215
查看次数

将侦听器对象作为函数参数传递给kotlin

我正在尝试将一个侦听器从一个动作传递给一个类(一个适配器).

在java中(来自Action的代码):

  private void setListeners() {
    adapterRecyclerView.setListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SomeCodehere....
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

(来自适配器的代码)

public void setListener(View.OnClickListener listener) {
    this.listener = listener;
}
Run Code Online (Sandbox Code Playgroud)

有用.

现在我正试图转向kotlin.我首先翻译动作(将动作翻译为kotlin):

    private fun setListeners() {
    // !! is not fine i know
    adapterRecyclerView!!.setListener  { v  ->
                          SomeCodehere....
    }
}
Run Code Online (Sandbox Code Playgroud)

此时仍然有效.适配器的代码仍然在java和kotlin中的类的代码.现在我将适配器翻译为kotlin:

fun setListener(listener: View.OnClickListener) {
    this.listener = listener 
}
Run Code Online (Sandbox Code Playgroud)

现在它不起作用.Action没有编译.

错误:无法推断此参数"v"的类型.必需的View.OnClickListener.发现(???)单位.

我该怎么做演员?为什么将参数从kotlin传递给java工作,从kotlin传递给kotlin它不是?

kotlin kotlin-interop

5
推荐指数
2
解决办法
7167
查看次数

为什么我不能在kotlin上使用lambda作为接口?

看,我有一个Java类:

public final class JavaReceiveSingle {
    public static void useSingle(Single single) {
        single.doSth();
    }
    public static void useSingle2(SingleInterface singleInterface) {
        singleInterface.doSth();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java接口:

public interface SingleInterface {
    void doSth();
}
Run Code Online (Sandbox Code Playgroud)

Kotlin界面:

interface Single {
    fun doSth()
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以在类似kotlin的类中使用lambda:

JavaReceiveSingle.useSingle2({})
Run Code Online (Sandbox Code Playgroud)

但是,如果我想对kotlin界面做同样的事情:

JavaReceiveSingle.useSingle({})
Run Code Online (Sandbox Code Playgroud)

IDE将显示错误:必需:单!找到:()->单位

如果我指定Single,例如:

JavaReceiveSingle.useSingle(Single{})
Run Code Online (Sandbox Code Playgroud)

仍然错误:Interface Single没有构造!

尽管以下代码可以工作:

JavaReceiveSingle.useSingle(object :Single{
    override fun aa() {}
})
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能将lambda用于kotlin接口呢?

lambda kotlin

5
推荐指数
1
解决办法
614
查看次数