Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java到Kotlin OnClickListener的翻译_Java_Android_Onclick_Kotlin_Onclicklistener - Fatal编程技术网

从Java到Kotlin OnClickListener的翻译

从Java到Kotlin OnClickListener的翻译,java,android,onclick,kotlin,onclicklistener,Java,Android,Onclick,Kotlin,Onclicklistener,我在翻译这段代码的方法上遇到了麻烦。 因此,我有一些JAVA代码,如下所示: 为按钮设置的OnClickListener: Button.OnClickListener mTakePicSOnClickListener = new Button.OnClickListener() { @Override public void onClick(View v) { dispatchTakePictureIntent(ACTION_TAKE_PHOTO_S)

我在翻译这段代码的方法上遇到了麻烦。 因此,我有一些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
    );
那么我有这个功能:

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);
    }
}
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
    }
}
所以我要求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
    )
然后函数:

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);
    }
}
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
我不知道如何在科特林创作这个,翻译给了我

有人知道a是应该翻译这个,还是采取另一种方法吗


非常感谢

当我在android studio中查看时,似乎没有界面按钮。OnClickListener,只要将其更改为View.OnClickListener,您就可以开始了

Kotlin的风格是使用lambda。例如:

btn.setOnClickListener { v -> doSomething() }
要将其作为参数传递,只需将其存储为

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

val侦听器:((视图)->Unit)={v->doSomething()}

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

fun foo(listener:((View) -> Unit)){
    btn.setOnClickListener(listener)
}

val l={ v:View -> Log.d("View", "click")}

foo(l)