Атрибут Button onClick не имеет значения, если активность написана в Котлине

Следуйте этому учебник: Android - Запуск другой активности, если я сделал MainActivity.java кнопка OnClick атрибут имеет sendMessage() метод.

Но если бы я сделал MainActivity.kt кнопку атрибута OnClick показывать нечего, только none.

Это ошибка Android Studio 3 или я что-то упустил для Kotlin?

Java mainActivity:

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
    }

}

Котлин mainActivity:

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
    }
}

OnClick attribute

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>

Ответ 1

Кажется, что дизайнер еще не поддерживает Котлина. Вот несколько решений:

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 {

}

Ответ 2

Ваш код будет выглядеть так:

button.setOnClickListener(){
            Toast.makeText([email protected], "Its toast!", Toast.LENGTH_SHORT).show();
        }

Здесь импорт будет:

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

Здесь "кнопка" - это идентификатор этой кнопки в XML файле. Здесь преимущество заключается в том, что нет необходимости создавать объект Button в вашем Java-классе.

Ответ 3

Однажды определил класс sendMessage как:

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

А также определил второй вид деятельности как:

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

Я добавил SendMessage в функцию OnClick: enter image description here

И тогда это сработало.

Ответ 4

Вы можете легко определить это внутри самого 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
    }
}

Ответ 5

Вот решение, которое я нашел в файле 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)
}