Wie kann ich den Kontext in einem Fragment erhalten?
Ich brauche meine Datenbank , deren Konstruktor nimmt im Kontext zu verwenden, aber getApplicationContext()
und FragmentClass.this
funktionieren nicht so , was kann ich tun?
Datenbankkonstruktor
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
in einer Instanzvariablen zu speichern , wenn das Fragment erstellt wird, und diesen Kontext dann zu verwenden, wann immer Sie möchten, innerhalb der Fragmentklasse. Dieser Kontext wird Fragmentablösungen überleben.getActivity
schon immer verfügbar. Es ist das,getContext
was in API 23 hinzugefügt wurde.Um die obige Antwort zu geben, können Sie die
onAttach
Fragmentmethode überschreiben :quelle
DatabaseHelper
nötig einFragmentActivity
statt einesActivity
? Zum Beispiel für einenAdapter
...onAttach(Activity activity)
, sollten Sie ihn inonDetach()
onAttach
Methode ist veraltet,Overrides deprecated method in 'android.support.v4.app.Fragment'
Verwenden Sie immer die Methode getActivity () , um den Kontext Ihrer angehängten Aktivität abzurufen , aber denken Sie immer an eines: Fragmente sind leicht instabil und
getActivity
manchmal null zurück. Überprüfen Sie daher immer die isAdded () -Methode des Fragments, bevor Sie den Kontext abrufengetActivity()
.quelle
Der einfachste und genaueste Weg, um den Kontext des gefundenen Fragments zu erhalten, besteht darin, es direkt von der Methode abzurufen,
ViewGroup
wenn Sie dieonCreateView
Methode aufrufen. Zumindest hier erhalten Sie sicher keine Null fürgetActivity()
:quelle
Früher bin ich mit
onAttach (Activity activity)
bekommencontext
inFragment
Die
onAttach (Activity activity)
Methode wurde in API-Level 23 nicht mehr unterstützt.Nun, um den Kontext zu erhalten
Fragment
, können wir verwendenonAttach (Context context)
context
.onCreate(Bundle)
wird danach aufgerufen.BEISPIELCODE
HINWEIS
Wir können auch verwenden
getActivity()
, umcontext
einzusteigenFragments
,getActivity()
können aber zurückkehren,null
wenn Ihrfragment
Mitglied derzeit keinem Elternteil zugeordnetactivity
ist.quelle
quelle
Sie können den Kontext auch
inflater
beim Überschreiben aus dem Parameter abrufenonCreateView
.quelle
Ein anderer alternativer Ansatz ist:
Sie können den Kontext erhalten mit:
quelle
Um den Kontext innerhalb des Fragments zu erhalten, ist Folgendes möglich
getActivity()
:Activity
mit dem Fragment verknüpfte zu verwendengetActivity()
. Sie können es verwenden, es wird jedoch nicht empfohlen, da es zu Speicherlecks führt.Ich denke, ein besserer Ansatz muss darin bestehen, das
Activity
aus deronAttach()
Methode herauszuholen :quelle
Activity.findViewById
ist nur eine bequeme Methode, um nach einer Ansicht in der registrierten Inhaltsansicht dieser Aktivität zu suchen (durchgesetztsetContentView
). In Ihrem korrekten Beispiel rufen SieView.findViewById
nicht aufActivity.findViewById
und rufen die Methode in der richtigen Stammansicht auf. Ganz anderes Problem, und offensichtlich können Sie Ihre Ansicht nicht in einer Ansicht finden, die diese Ansicht nicht enthält.getContext()
kam in API 23. Ersetzen Sie es überall im Code durch getActivity ().Überprüfen Sie, ob der Fehler behoben ist. Versuchen Sie, Methoden zu verwenden, die zwischen der Ziel- und der Minimun-API-Ebene liegen. Andernfalls tritt dieser Fehler auf.
quelle
Seit API-Level 23 gibt es
getContext()
aber wenn Sie ältere Versionen unterstützen möchten, können Sie diese verwenden,getActivity().getApplicationContext()
während ich weiterhin empfehle, die Support-VersionFragment
davon zu verwendenandroid.support.v4.app.Fragment
.quelle
getActivity()
ist ein Kind von Context, so dass für Sie arbeiten solltequelle
Verwenden Sie Fragmente aus der Support Library -
und dann überschreiben
Auf diese Weise können Sie sicher sein, dass der Kontext immer ein Wert ungleich Null ist.
quelle
Sie haben verschiedene Möglichkeiten:
getActivity()
, da dies ein istContext
.getContext()
.Wenn Sie alte Versionen nicht unterstützen müssen, gehen Sie mit
getContext()
.quelle
Für Kotlin können Sie
context
direkt in Fragmenten verwenden. Aber in einigen Fällen finden Sie einen Fehler wiedafür kannst du das machen
quelle
In Kotlin einfach
activity
anstelle von verwendengetActivity()
quelle
Mit API 29+ auf Kotlin musste ich tun
Ein Beispiel wäre
quelle
Idealerweise sollten Sie keine Globals verwenden müssen. Das Fragment verfügt über verschiedene Benachrichtigungen, von denen eine onActivityCreated ist. Sie können die Instanz der Aktivität in diesem Lebenszyklusereignis des Fragments abrufen.
Dann: Sie können das Fragment dereferenzieren, um Aktivität, Kontext oder Anwendungskontext zu erhalten, wie Sie möchten:
this.getActivity()
gibt Ihnen das Handle für die Aktivitätthis.getContext()
gibt Ihnen ein Handle für den Kontextthis.getActivity().getApplicationContext()
gibt Ihnen das Handle für den Anwendungskontext. Sie sollten den Anwendungskontext vorzugsweise verwenden, wenn Sie ihn an die Datenbank weitergeben.quelle
Der einfache Weg ist zu verwenden
getActivity()
. Aber ich denke die größte Verwirrung bei der Verwendung dergetActivity()
Methode zum Abrufen des Kontexts hier eine Nullzeigerausnahme ist.Überprüfen Sie dazu zunächst die
isAdded()
Methode , mit der ermittelt wird, ob sie hinzugefügt wurde oder nicht, und verwenden Sie dann diegetActivity()
, um den Kontext der Aktivität abzurufen.quelle
Sie können anrufen
getActivity()
oder,quelle
Sie können die Methode getActivity () verwenden, um den Kontext abzurufen, oder Sie können die Methode getContext () verwenden.
Ich hoffe, es hilft!
quelle
Die Methode getContext () hilft dabei, den Kontext der Klasse in einer Fragmentaktivität zu verwenden.
quelle
Ich denke du kannst es benutzen
quelle
quelle
Sie können auch verwenden:
aber ich würde es vorziehen zu verwenden
oder
quelle
Ich benötige Kontext für die Verwendung des ArrayAdapter IN-Fragments. Wenn ich getActivity verwendet habe , tritt ein Fehler auf, aber wenn ich ihn durch getContext ersetze , funktioniert er für mich
quelle
Sie können
getActivity()
odergetContext
in Fragment verwenden.Dokumentation
und
Profi-Tipp
Überprüfen Sie immer,
if(getActivity!=null)
ob es null sein kann, wenn das Fragment nicht an die Aktivität angehängt ist. Manchmal dauert es einige Zeit, lange Operationen in Fragmenten durchzuführen (z. B. Daten von der Rest-API abzurufen). und wenn der Benutzer zu einem anderen Fragment navigiert. Dann ist getActivity null. Und Sie erhalten NPE, wenn Sie nicht damit umgehen.quelle
FragmentHostCallback
Klasse.Auf dich Fragment
Über Aktivität
quelle
Innenfragment für Kotlin-Probe würde jemandem helfen
wenn Sie Datenbindung verwenden;
Wo BindingView in onCreateView wie folgt initialisiert wird
quelle
Die Methode requireContext () ist die einfachste Option
Beispiel
quelle