按钮 onClick 属性是 none 如果 activity 用 Kotlin 写

Button onClick attribute is none if activity written in Kotlin

按照本教程进行操作:Android - Start Another Activity 如果我制作了 MainActivity.java 按钮 OnClick 属性具有 sendMessage() 方法。

但是如果我制作MainActivity.kt按钮OnClick属性没有什么可显示的,只是一个none.

这是 Android Studio 3 错误还是我遗漏了 Kotlin 的某些内容?

Java 主要活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /** Called when the user taps the Send button */
    public void sendMessage(View view) {
        // Do something in response to button
    }

}

科特林主要活动:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    /** Called when the user taps the Send button  */
    fun sendMessage(view: View) {
        // Do something in response to button
    }
}

XML布局(Java和Kotlin项目一样)

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ir.bigbang.vahid.myapplication.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="148dp"
        tools:layout_editor_absoluteY="81dp" />
</android.support.constraint.ConstraintLayout>

您可以在 XML 本身中轻松定义它。但是使用android:onClick属性还是有点贵。

相反,您可以考虑使用 Kotlin Android Extensions 和合成属性:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener {
        // Do something in response to button
    }
}

看来设计者还不支持Kotlin。这里有一些解决方案:

XML(不推荐)

将以下行添加到您的 Button 标记中。这正是设计师要做的。

android:onClick="sendMessage"

旧时尚

无需添加任何内容。

val button = findViewById<Button>(R.id.Button)
button.setOnClickListener {

}

kotlin-android-扩展(推荐)

apply plugin: "kotlin-android-extensions" 添加到您的 build.gradle

// button is the Button id
button.setOnClickListener {

}

这是我在 MainActivity.kt 文件中提出的解决方案。

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val button = findViewById<Button>(R.id.button)
    button.setOnClickListener {
        sendMessage()
    }
}

/** Called when the user taps the Send button  */
private fun sendMessage() {
    val editText = findViewById<EditText>(R.id.editText)
    val message = editText.text.toString()
    val intent = Intent(this, DisplayMessageActivity::class.java).apply 
    {
        putExtra(EXTRA_MESSAGE, message)
    }
    startActivity(intent)
}

您的代码会像这样:

button.setOnClickListener(){
            Toast.makeText(this@MainActivity, "Its toast!", Toast.LENGTH_SHORT).show();
        }

这里导入会:

import kotlinx.android.synthetic.main. activity_main.*

此处 "button" 是 .xml 文件中该按钮的 ID。这里的优点是不需要在 java class 中创建 Button 对象。

一旦将 sendMessage class 定义为:

/** Called when the user taps the Send button  */
fun sendMessage(view: View) {
    setContentView(R.layout.activity_second)
    // Do something in response to button
}

并且还定义了第二个 activity 为:

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }
}

我将 SendMessage 添加到 OnClick 函数中:

然后成功了。

按钮 OnClick 实现它可以通过 Android

中的一些方法来完成

一些可能的方法如下示例:

1>使用 OnClickListener 作为接口 这里我们用 OnClicklistener 实现我们的主要 activity 并覆盖函数 onClick

override fun onClick(v: View?) {
        when (v?.id){
            (R.id.btn1) -> {
                toastmsg("Button1");
            }

            R.id.btn2 -> {
                toastmsg("Button2");
            }
        }
    }

2>并创建一个函数并将 OnClickListener 传递给 变量样本:

        findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);

var btnClick =
        OnClickListener {
            Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
        }

3>在 Oncreate() 中创建 OnClickListener

  btn1=findViewById(R.id.btn1);
        btn1?.setOnClickListener {
            toastmsg("test button1");
        }

示例的完整示例代码,它包含 Button OnClickListener 的所有可能实现:

class MainActivity : AppCompatActivity() , OnClickListener{

    lateinit var tv1:TextView;
    lateinit var tv2:TextView;
    lateinit var tv3:TextView;

    var btn1: Button? =null;
    var btn2: Button? =null;
    var btn3: Button? =null;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn1=findViewById(R.id.btn1);
        btn1?.setOnClickListener {
            toastmsg("test button1");
        }

        findViewById<Button>(R.id.btn2).setOnClickListener(this);

        findViewById<Button>(R.id.btn3).setOnClickListener(btnClick);

    }

    var btnClick =
        OnClickListener {
            Toast.makeText(this, "BtnClick", Toast.LENGTH_SHORT).show() ;
        }


    override fun onClick(v: View?) {
        when (v?.id){
            (R.id.btn1) -> {
                toastmsg("Button1");
            }

            R.id.btn2 -> {
                toastmsg("Button2");
            }
        }
    }

    private fun toastmsg(msg: String){
        Toast.makeText(this, "DaggerTest" + msg, Toast.LENGTH_SHORT).show();
    }
}