Jak korzystać z rozszerzeń systemu Android Kotlin za pomocą Fragment
s? Jeśli użyję ich w środku onCreateView()
, otrzymam ten NullPointerException
wyjątek:
Przyczyna: java.lang.NullPointerException: Próba wywołania metody wirtualnej „android.view.View android.view.View.findViewById (int)” w odwołaniu do obiektu o wartości null
Oto kod fragmentu:
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
}
}
`
android
kotlin
kotlin-android-extensions
solidak
źródło
źródło
rootView.btn_K.setOnClickListener
Odpowiedzi:
Syntetyczne właściwości Kotlin nie są magiczne i działają w bardzo prosty sposób. Gdy uzyskujesz dostęp
btn_K
, wymagagetView().findViewById(R.id.btn_K)
.Problem polega na tym, że uzyskujesz do niego dostęp zbyt wcześnie.
getView()
powracanull
wonCreateView
. Spróbuj to zrobićonViewCreated
metodą:źródło
onViewCreated()
getView()
lub nie może wywoływaćfindViewById()
, czy istnieje sposób obejścia tego? Na przykład, naucz, która funkcja zwróci mój układ?rootView.btn_K
, jakbyś miał widok (i to nie tylko we fragmentach, można to zrobić wszędzie)Dzwonisz na to
btn_K
za wcześnie, ponieważ wtedy zwraca wartość zerową i daje ci wyjątek wskaźnika zerowego.Możesz użyć tych widoków za pomocą tej syntetycznej wtyczki w
onActivityCreated()
metodzie, która jest nazywana tuż poonCreateView()
cyklu życia Fragmentu.źródło
onViewCreated
ale zostały zdefiniowane wonActivityCreated
. Nie wiem jednak dlaczego.Właściwości syntetyczne wygenerowane przez wtyczkę Kotlin Android Rozszerzenia potrzebuje
view
doFragment/Activity
być ustawione przed ręką.W twoim przypadku
Fragment
musisz użyćview.btn_K
wonViewCreated
Lub lepiej, powinieneś mieć dostęp tylko do właściwości syntetycznych w
onViewCreated
Zauważ, że
savedInstanceState
parametr powinien mieć wartość zerowąBundle?
, a także sprawdź Importowanie właściwości syntetycznychźródło
jedyne, co musisz zrobić, to:
źródło
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Lepiej jest używać widoków zaczynających się odonViewCreated
nie ma potrzeby definiowania obiektu towarzyszącego, wystarczy wywołać każdy identyfikator w widoku takim jak
źródło
Fragmenty napisz kod w onActivityCreated: -
źródło
onViewCreated
zamiast tego?W moim przypadku nic nie działało, dopóki nie zastosowałem się do rady Otziii w komentarzach. Wyczyść, przebuduj (nie wymaga restartu), uruchom ponownie aplikację. Ja też nie musiałem iść z tym
onActivityCreated
i po prostuonCreateView
zrobiłem to.Pewnego razu popełniłem również błąd nadmuchiwania złego układu, dlatego nie otrzymałem oczywiście oczekiwanych kontroli.
źródło
onActivityCreated
zbytDodając go do odpowiedzi @Egor Neliuba, Tak, za każdym razem, gdy wywołujesz widok bez odniesienia, kotlinex szuka rootView, a ponieważ jesteś wewnątrz fragmentu i fragment nie ma
getView()
metody. Dlatego może rzucićNullPointerException
Istnieją dwa sposoby na przezwyciężenie tego,
onViewCreated()
jak wspomnianoLub Jeśli chcesz powiązać widoki w innej klasie (powiedzmy anonimowy), możesz po prostu utworzyć funkcję rozszerzenia taką jak ta,
fun View.bindViews(){...}
Drugie podejście jest pomocne, gdy masz jeden fragment z wieloma zachowaniami.
źródło
}
** Tutaj używasz btn_K.setOnClickListener przed znalezieniem - Musisz znaleźć element xml w kodzie java / kotlin za pomocą findViewById wtedy i tylko wtedy możesz wykonać operację na tym widoku lub elemencie.
- Więc dlatego wykonałeś zerowy wskaźnik
**
źródło