从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)