web-dev-qa-db-fra.com

L'attribut bouton onClick est nul si l'activité est écrite en Kotlin

Suivez ce tutoriel: Android - Démarrer une autre activité si l’attribut MainActivity.Java button OnClick a la méthode sendMessage().

Mais si j'ai créé l'attribut MainActivity.kt button OnClick n'a rien à afficher, juste un none.

Est-ce un bug d'Android Studio 3 ou j'ai raté quelque chose pour 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
    }

}

Kotlin 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

Disposition XML (les projets Java et Kotlin sont identiques)

    <?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>
15
Vahid

Il semble que le concepteur ne supporte pas encore Kotlin. Voici une solution:

XML ​​(non recommandé)

Ajoutez la ligne suivante à votre balise Button. C'est exactement ce que le designer va faire.

Android:onClick="sendMessage"

Ancienne mode

Pas besoin d'ajouter quoi que ce soit.

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

}

kotlin-extensions-Android (Recommandé)

Ajoutez apply plugin: "kotlin-Android-extensions" à votre build.gradle

// button is the Button id
button.setOnClickListener {

}
17
Joshua

Voici la solution que j'ai trouvée dans le fichier 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)
}
1
John

Une fois la classe sendMessage définie:

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

Et aussi défini une deuxième activité comme:

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

J'ai ajouté le SendMessage à la fonction OnClick:  enter image description here

Et puis ça a marché.

1
Alex

Votre code va ressembler à ça:

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

Ici l'importation va:

import kotlinx.Android.synthetic.main. activity_main.*

Ici "bouton" est l'identifiant de ce bouton dans le fichier .xml. Ici, l'avantage n'est pas nécessaire de créer un objet Button dans votre classe Java. 

1

Vous pouvez facilement définir ceci à l'intérieur du XML lui-même. Mais utiliser l'attribut Android:onClick est toujours un peu cher.

Au lieu de cela, vous pouvez envisager d’utiliser les propriétés de Kotlin Android Extensions et de synthèse:

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