从Java转换到Kotlin OnClickListener

我在这个代码可以被翻译的方式上遇到麻烦。 所以我在JAVA中有几个代码,如下所示:

为按钮设置的OnClickListener:

Button.OnClickListener mTakePicSOnClickListener = new Button.OnClickListener() { @Override public void onClick(View v) { dispatchTakePictureIntent(ACTION_TAKE_PHOTO_S); } }; 

然后,我有按钮本身,并将该OnClickListener应用于该按钮的函数:

 Button picSBtn = (Button) findViewById(R.id.btnIntendS); setBtnListenerOrDisable( picSBtn, mTakePicSOnClickListener, MediaStore.ACTION_IMAGE_CAPTURE ); 

那我有这个function:

 private void setBtnListenerOrDisable( Button btn, Button.OnClickListener onClickListener, String intentName ) { if (isIntentAvailable(this, intentName)) { btn.setOnClickListener(onClickListener); } else { btn.setText( getText(R.string.cannot).toString() + " " + btn.getText()); btn.setClickable(false); } } 

所以我要求Android Studio将代码翻译成kotlin。

它只是做了一些小的改变,但在这种情况下,它不起作用。 看来这个方法有很大的不同。

所以在Kotlin中,代码的相同部分是这样的:

 internal var mTakePicSOnClickListener: Button.OnClickListener = object : Button.OnClickListener { override fun onClick(v: View) { dispatchTakePictureIntent(ACTION_TAKE_PHOTO_S) } } 

更改一些代码后,我有:

 val picSBtn = btnIntendS as Button setBtnListenerOrDisable( picSBtn, mTakePicSOnClickListener, MediaStore.ACTION_IMAGE_CAPTURE ) 

那么function:

 private fun setBtnListenerOrDisable( btn: Button, onClickListener: View.OnClickListener, intentName: String ) { if (isIntentAvailable(this, intentName)) { btn.setOnClickListener(onClickListener) } else { btn.text = getText(R.string.cannot).toString() + " " + btn.text btn.isClickable = false } } 

AndroidStudio指出的错误是创建“通用”OnClickListener:

 internal var mTakePicSOnClickListener: Button.OnClickListener 

我不知道在Kotlin中创造了这个,译者也给了我这个。

有谁知道,如果应该只是翻译,或采取另一种方法?

非常感谢!

当我在Android工作室检查,似乎没有接口Button.OnClickListener,只是将其更改为View.OnClickListener,你应该很好去。

Kotlin风格将使用lambda。 例如 :

 btn.setOnClickListener { v -> doSomething() } 

要把这个作为一个参数来传递,就把它存储为

val listener={v:View -> doSomething()}

要么

val listener:((View) -> Unit)={v -> doSomething()}

要将它传递给函数,参数应该如下所示:

 fun foo(listener:((View) -> Unit)){ btn.setOnClickListener(listener) } val l={ v:View -> Log.d("View", "click")} foo(l)