如何在 Kotlin 中设置非内联 OnClickListener?

dug*_*ous 5 android kotlin

我想将 a 附加View.OnClickListener到 a Button。我不想OnClickListener成为内联匿名函数定义。相反,我想在onCreateView()函数范围之外定义它。

在 Java 中,我会这样做:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                       Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.my_layout, container, false);
    View my_btn = view.findViewById(R.id.my_btn);
    my_btn.setOnClickListener(handleButtonClick);
    return view;
}

View.OnClickListener handleButtonClick = new View.OnClickListener()
{
    @Override public void onClick(View v) 
    {
        Log.d("my_tag", "click!")
    }
}
Run Code Online (Sandbox Code Playgroud)

其他答案似乎表明以下内容可行,但它不适合我:

    override fun onCreateView(name: String?, context: Context?, attrs: AttributeSet?): View
    {
        var view = super.onCreateView(name, context, attrs)
        my_btn.setOnClickListener( handleButtonClick  )
        return view
    }

    private val handleButtonClick = View.OnClickListener 
    {  
        view->
        Log.d("my_tag", "click!")
    }
Run Code Online (Sandbox Code Playgroud)

上面有什么问题,我如何OnClickListener在我的Activity类中将一个定义为命名属性?

crg*_*dos 5

正确缩进可以解决问题。

private val handleButtonClick = View.OnClickListener {  view->
    Log.d("my_tag", "click!")
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所提到的,由于viewparam 是唯一的并且被忽略,因此您可以摆脱它。

如果你想使用一个对象:

val handleButtonClick = object : View.OnClickListener {
    override fun onClick(view: View) {
        Log.d("my_tag", "click!")
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如@Mango所提到的,这是语法定义中规定的限制。