Les vues dans android studio

Bonjour,

je rencontre un soucis sur android studio, il y a quelques jours quand je crée par exemple un bouton dans le layout .xml avec un id btn1, je n’arrive plus à le récupérer dans le fichier .kt comme je le faisais il y a quelques jours en tapant juste btn1.setOnClickListenner…
Savez vous ce qu’il faut faire? Android studio est bien à jour. 4.1

Merci.

1 J'aime

Hello,

Tu déclares bien ton bouton en private lateinit var button: Button en début de classe, ensuite tu charges le layout concerné setContentView(R.layout.layout) dans ton onCreate et enfin du fais un button = findViewById(R.id.btn1) ?

1 J'aime

en fait si je le fais de cette manière ça fonctionne bien. Mais il y a 2 jours je le faisais sans déclarer ni même en faisant findViewById je n’avais qu’à saisir dans le onCreate btn1 et ça fonctionnait sans problème, l’autocomplétion apparaissait directement mais depuis hier plus rien.

Peut-être que tu avais qu’une seule classe et un seul layout mais, dans tous les cas, c’est pas très clean de le faire sans rien déclarer avant, ça peut amener à des planages systématiques au chargement de ta classe car le btn1 sera inconnu.

2 J'aime

Je vais le faire de cette manière alors, peut être qu’ils ont du mettre la mise a jour pour que ça évite justement les plantages. Pourquoi faire private lateinit var button: Button?

Pour faire savoir à Android que tu veux créer une variable button de type Button, que tu viendras initialiser plus tard dans ton onCreate et quand tu auras relié ta classe au layout. Comme ça, tu pourras librement l’utiliser dans toute ta classe.
Aussi, si pour une raison particulière, à un moment donné tu ne l’initialise pas par la suite, ça évite de créer des variables inutilisées dans la mémoire.

1 J'aime

Merci a toi, ta réponse est vraiment claire, je n’ai jamais compris comment utiliser le lateinit. Maintenant je suis bien pour continuer sur kotlin!!

1 J'aime
    class MainActivity : AppCompatActivity() {

private var questionNo = 0
private var questions = listOf("What are the two official languages for Android development? \n\n A) Kotlin and Java \n\n B) Java and Python \n\n C) Kotlin and Python", "How do you define a function in Kotlin? \n\n A) void \n\n B) var \n\n C) function", "What is a variable used for? \n\n A) To contain data \n\n B) To insert a random value \n\n C) Don't know", "What does SDK stand for in Android SDK? \n\n A) Software Development Kit \n\n B) Software Development Kotlin \n\n C) Something Don't Know")
private var rightAnswers = listOf(1, 2, 1, 1)
private val textView: TextView = findViewById(R.id.textView)
private lateinit var btn: Button
private lateinit var btn2: Button
private lateinit var btn3: Button

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

    btn = findViewById(R.id.button)
    btn2 = findViewById(R.id.button2)
    btn3 = findViewById(R.id.button3)


    btn.setOnClickListener {
        showToast(1)
    }

    btn2.setOnClickListener {
        showToast(2)
    }

    btn3.setOnClickListener {
        showToast(3)
    }

}

private fun showToast(answer: Int) {
    if (answer==rightAnswers.get(questionNo)) {
        Toast.makeText(applicationContext, "CORRECT!", Toast.LENGTH_SHORT).show()
        updateQuestion()
    } else {
        Toast.makeText(applicationContext, "WRONGO!", Toast.LENGTH_SHORT).show()
    }
}

private fun updateQuestion() {
    questionNo += 1
    textView.text = questions[questionNo]
}

}

je ne comprends pas pourquoi mon app se crashe quand je le lance…

C’est pas là que ça plante ?
Ça m’étonnerait que tu puisses initialiser un TextView sans avoir dit à quel layout tu faisais référence avant.
Fais comme le reste : private lateinit var textView: TextView
Et dans le onCreate, après avoir initialisé tes boutons, textView = findViewById(R.id.textView)

1 J'aime

ha oui, je suis bête moi aussi!
Merci à toi!

salut Peter, j’ai rencontré le même problème depuis que j’ai utilisé AppBar

1 J'aime

Salut ghosthio, comment ca?

, la barre de menu bleu ne s’affiche plus, en plus je pensais qu’avec kotlin on n’a besoin d’initialiser comme java les widgets pour les utiliser, juste utiliser l’ID

1 J'aime

J’ai tjs eu l’habitude d’utiliser l’ID jusqu’à aujourd’hui après je pense que c’est peut etre pour éviter qu’il y ait des plantages, après la barre bleue je ne vois pas de quoi tu parles exactement, parce que si c’est la barre de menu il suffit de cliquer sur « l’oeil » et cocher l’option « Show System UI »

1 J'aime

merci pour la barre bleue :wink:…après la déclaration des widgets c’est bizarre

en tout cas merci