Je travaille sur un projet de studio Android qui est un hybride de kotlin et java. J'essaie de définir un onClickListener sur un bouton, mais je continue à rencontrer des erreurs de compilation comme les suivantes:
private var buttonBookmarks: Button? = null
//these two are in onCreate
var buttonBookmarks = findViewById<Button>(R.id.btn_bookmarks)
buttonBookmarks.setOnClickListener {
Toast.makeText(this, "Works", LENGTH_LONG).show()
}
Voici mon code:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.folioreader.android.sample/com.folioreader.ui.activity.FolioActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
3 Réponses :
C'est à cause du this ici, vous devriez faire le onClickListener comme ceci
class FolioActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.folio_activity) <-- this one
}
}
Une autre alternative pourrait être de créer un var mContext: Context puis attribuez-le dans onCreate () ou quelque chose faisant mContext = this alors au lieu de this , vous pouvez utilisez mContext et cela devrait fonctionner.
Aussi cette erreur
java.lang.RuntimeException: impossible de démarrer l'activité ComponentInfo {com.folioreader.android.sample / com.folioreader.ui.activity.FolioActivity}:
Dit que votre activité n'est pas chargée correctement, avez-vous quelque chose comme ça?
buttonBookmarks.setOnClickListener({ v ->
Toast.makeText(v.getContext(), "Works", Toast.LENGTH_LONG).show()
})
Si quelqu'un vote contre, veuillez ajouter une raison :)
Cela a fonctionné, cette ligne de code: setContentView (R.layout.folio_activity) était un peu en dessous dans la méthode onCreate. Je viens de placer votre code en dessous et cela a fonctionné.
@ Skizo-ozᴉʞS raison de voter contre: le contexte n'a rien à voir avec son erreur. il y a un problème avec setContentView (R.layout.folio_activity) et mieux utiliser Toast.LENGTH_LONG sans importer un autre paquet.
Dans Kotlin, vous n'avez pas besoin de findViewById.
apply plugin: 'kotlin-android-extensions'
Devrait fonctionner correctement à l'aide de kotlin-synthétique si l'erreur persiste alors vous devriez regarder l'ID et vous assurer qu'ils correspondent .
Remarque: Pour utiliser kotlin-synthétique , vous devez appliquer des plugins comme suit
btn_bookmarks.setOnClickListener {
Toast.makeText(this, "Works", LENGTH_LONG).show()
}
Pour plus d'informations sur l'extension, visitez ici
C'est une bonne idée aussi, mais ne répond pas vraiment à la question, c'est comme un "conseil", de toute façon bien expliqué
Cela fonctionne aussi, mais ne résout pas vraiment le problème. Je vais prendre le pourboire et supprimer la méthode findViewByID ().
Publiez votre activity_main.xml
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
private var buttonBookmarks: Button? = null
//these two are in onCreate
var buttonBookmarks = findViewById<Button>(R.id.btn_bookmarks)
buttonBookmarks.setOnClickListener {
Toast.makeText(this, "Works", LENGTH_LONG).show()
}
}
}
I just tried your code. It works perfectly. Your syntax seems correct, By seeing your Error java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference only thing is your buttonBookmarks is null reason may be you are either missing the button in your activity's XML file or you are referencing the wrong element.
Comment private var buttonBookmarks: Button? = null too.
Hope It helps
Thanks
n'est-ce pas possible s'il supprime var de findviewbyid? et simplement fournir le nom de la mise en page ContentView à son activité?
oui, vous pouvez supprimer var et appeler directement setOnClickListener sur findViewById
Il vous manque un
setContentView