Wie verwende ich Kotlin Android Extensions mit Fragment
s? Wenn ich sie im Inneren verwende onCreateView()
, erhalte ich diese NullPointerException
Ausnahme:
Auslöser: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.view.View android.view.View.findViewById (int)' für eine Nullobjektreferenz aufzurufen
Hier ist der Fragmentcode:
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
quelle
quelle
rootView.btn_K.setOnClickListener
Antworten:
Die synthetischen Eigenschaften von Kotlin sind keine Zauberei und funktionieren auf sehr einfache Weise. Wenn Sie zugreifen
btn_K
, fordert esgetView().findViewById(R.id.btn_K)
.Das Problem ist, dass Sie zu früh darauf zugreifen.
getView()
kehrtnull
in zurückonCreateView
. Versuchen Sie es in deronViewCreated
Methode:quelle
onViewCreated()
getView()
oder nicht aufrufen kannfindViewById()
, gibt es eine Möglichkeit, diese zu umgehen? Lehren Sie zum Beispiel, welche Funktion mein Layout zurückgibt.rootView.btn_K
wenn Sie eine Ansicht haben (und nicht nur in Fragmenten, dies kann überall erfolgen)Sie rufen dies
btn_K
zu früh auf, da zu diesem Zeitpunkt eine Null zurückgegeben wird und Sie eine Null-Zeiger-Ausnahme erhalten.Sie können diese Ansichten mit dieser synthetischen Plugin-In-
onActivityCreated()
Methode verwenden, die unmittelbar nach demonCreateView()
Fragment-Lebenszyklus aufgerufen wird .quelle
onViewCreated
aber dann definiert inonActivityCreated
. Ich weiß aber nicht warum.Synthetische Eigenschaften erzeugt durch Kotlin Android Extensions Plugin muss eine
view
fürFragment/Activity
vorher festgelegt werden.In Ihrem Fall für
Fragment
, müssen Sie verwendenview.btn_K
inonViewCreated
Oder besser, Sie sollten nur auf synthetische Eigenschaften in zugreifen
onViewCreated
Beachten Sie, dass der
savedInstanceState
Parameter nullwertfähig sein sollteBundle?
, und aktivieren Sie das Kontrollkästchen Synthetische Eigenschaften importierenquelle
Das einzige, was Sie tun müssen, ist:
quelle
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Es ist besser, Ansichten abonViewCreated
Es ist nicht erforderlich, ein Begleitobjekt zu definieren. Rufen Sie einfach jede ID über eine Ansicht wie auf
quelle
In Fragmente schreiben Sie bitte Ihren Code in onActivityCreated: -
quelle
onViewCreated
stattdessen?In meinem Fall hat nichts funktioniert, bis ich den Ratschlägen von Otziii in den Kommentaren gefolgt bin . Bereinigen, neu erstellen (kein Neustart erforderlich), App erneut ausführen. Ich musste auch nicht mitgehen
onActivityCreated
und habe einfachonCreateView
den Trick gemacht.Einmal habe ich auch den Fehler gemacht, ein falsches Layout aufzublasen, wodurch ich offensichtlich nicht die erwarteten Steuerelemente bekam.
quelle
onActivityCreated
zuWenn Sie es zu @Egor Neliubas Antwort hinzufügen: Ja, wenn Sie eine Ansicht ohne Referenz aufrufen, sucht kotlinex nach einer rootView, und da Sie sich in einem Fragment befinden und das Fragment keine
getView()
Methode hat. Deshalb könnte es werfenNullPointerException
Es gibt zwei Möglichkeiten, dies zu überwinden:
onViewCreated()
wie erwähntOder Wenn Sie Ansichten in einer anderen Klasse (z. B. anonym) binden möchten, können Sie einfach eine Erweiterungsfunktion wie diese erstellen:
fun View.bindViews(){...}
Der zweite Ansatz ist hilfreich, wenn Sie ein einzelnes Fragment mit mehreren Verhaltensweisen haben.
quelle
}}
** Hier verwenden Sie btn_K.
- Deshalb haben Sie die Ausführung eines Nullzeigers erhalten
** **.
quelle