Comment utiliser les extensions Android Kotlin avec Fragment
s? Si je les utilise à l'intérieur onCreateView()
, j'obtiens cette NullPointerException
exception:
Causée par: java.lang.NullPointerException: tentative d'appel de la méthode virtuelle 'android.view.View android.view.View.findViewById (int)' sur une référence d'objet null
Voici le code du fragment:
package com.obaied.testrun.Fragment
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*
public class CardSelectorFragment : Fragment() {
val TAG = javaClass.canonicalName
companion object {
fun newInstance(): CardSelectorFragment {
return CardSelectorFragment()
}
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
return rootView
}
}
`
rootView.btn_K.setOnClickListener
Réponses:
Les propriétés synthétiques de Kotlin ne sont pas magiques et fonctionnent de manière très simple. Lorsque vous y accédez
btn_K
, cela demandegetView().findViewById(R.id.btn_K)
.Le problème est que vous y accédez trop tôt.
getView()
retoursnull
dansonCreateView
. Essayez de le faire dans laonViewCreated
méthode:la source
onViewCreated()
getView()
ou qu'elle ne peut pas invoquerfindViewById()
, existe-t-il un moyen de contourner cela? Par exemple, lui apprendre quelle fonction retournera ma mise en page?rootView.btn_K
si vous aviez une vue (et pas seulement par fragments, cela peut être fait partout)Vous appelez cela
btn_K
trop tôt car à ce moment-là, il renvoie une valeur nulle et vous donne une exception de pointeur nul.Vous pouvez utiliser ces vues par ce plugin synthétique dans la
onActivityCreated()
méthode qui est appelée juste après leonCreateView()
cycle de vie du fragment.la source
onViewCreated
mais définies dansonActivityCreated
. Je ne sais pas pourquoi cependant.Propriétés synthétiques générées par Kotlin Android Extensions plug - in a besoin d' un
view
pourFragment/Activity
être mis en avant la main.Dans votre cas, pour
Fragment
, vous devez utiliserview.btn_K
dansonViewCreated
Ou mieux, vous ne devez accéder aux propriétés synthétiques que dans
onViewCreated
Veuillez noter que le
savedInstanceState
paramètre doit être nullableBundle?
, et vérifiez également Importation des propriétés synthétiquesla source
la seule chose que vous devez faire est:
la source
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Il est préférable d'utiliser les vues à partir deonViewCreated
pas besoin de définir un objet compagnon, il suffit d'appeler chaque id par une vue comme
la source
Dans Fragments, veuillez écrire votre code dans onActivityCreated: -
la source
onViewCreated
place?Dans mon cas, rien n'a fonctionné jusqu'à ce que je suive les conseils d' Otziii dans les commentaires. Nettoyez, reconstruisez (aucun redémarrage nécessaire), réexécutez l'application. Je n'avais pas non plus besoin d'y aller
onActivityCreated
et j'ai justeonCreateView
fait l'affaire.Une fois, j'ai également fait l'erreur de gonfler la mauvaise disposition, n'obtenant donc pas les contrôles attendus.
la source
onActivityCreated
aussiEn l'ajoutant à la réponse de @Egor Neliuba, Oui chaque fois que vous appelez une vue sans référence, kotlinex recherche une rootView, et puisque vous êtes à l'intérieur d'un fragment et que le fragment n'a pas de
getView()
méthode. Par conséquent, cela pourrait jeterNullPointerException
Il y a deux façons de surmonter cela,
onViewCreated()
comme mentionnéOu si vous souhaitez lier des vues dans une autre classe (par exemple anonyme), vous pouvez simplement créer une fonction d'extension comme celle-ci,
fun View.bindViews(){...}
La deuxième approche est utile lorsque vous avez un seul fragment avec plusieurs comportements.
la source
}
** Ici, vous utilisez btn_K.setOnClickListener avant de trouver -Vous devez trouver l'élément XML sous votre code java / kotlin en utilisant findViewById puis et seulement vous pouvez effectuer une opération sur cette vue ou cet élément.
-Alors c'est pour cela que vous avez obtenu une exception de pointeur nul
**
la source