2013-08-09 8 views
8

Ich habe eine Frage bezüglich der Verwendung von Kontext in einem Fragment. Mein Problem ist, dass ich immer eine NullpointerException bekomme. Hier ist, was ich tue:Warum ist mein Kontext in meinem Fragment null?

Erstellen Sie eine Klasse, die das SherlockFragment erweitert. In dieser Klasse habe ich eine Instanz einer anderen Hilfsklasse:

public class Fragment extends SherlockFragment { 
    private Helper helper = new Helper(this.getActivity()); 

    // More code ... 
} 

Hier ist ein Auszug aus der anderen Helper Klasse:

public class Helper { 
    public Helper(Context context) { 
     this.context = context; 
    } 
    // More code ... 
} 

Jedesmal, wenn ich context.someMethod nennen (zB context.getResources()) ich eine NullPointerException. Warum das?

+0

Sieht aus wie 'SherlockFragment # activity' nicht gesetzt ist, wenn Ihr Fragment initialisiert aber in einer späteren Phase injiziert, so wird' null' im Konstruktor. –

Antwort

16

Sie versuchen, eine Context zu erhalten, wenn die Fragment erste instanziiert wird. Zu dieser Zeit ist es nicht an eine Activity angeschlossen, so dass es keine gültige Context gibt.

Werfen Sie einen Blick auf die Fragment Lifecycle. Alles zwischen onAttach() bis onDetach() enthält einen Verweis auf eine gültige Context-Instanz. Diese Context-Instanz wird in der Regel über getActivity()

Codebeispiel abgerufen:

private Helper mHelper; 

@Override 
public void onAttach(Activity activity){ 
    super.onAttach (activity); 
    mHelper = new Helper (activity); 
} 

I verwendet onAttach() in meinem Beispiel @LaurenceDawson verwendet onActivityCreated(). Beachten Sie die Unterschiede. Da onAttach() einen Activity schon bekommt, habe ich getActivity() nicht benutzt. Stattdessen benutzte ich das Argument bestanden. Für alle anderen Methoden im Lebenszyklus müssen Sie getActivity() verwenden.

+0

Können Sie mir ein paar Tipps für die Code-Implementierung geben? – user2426316

+0

@ user2426316 Ich habe ein Beispiel hinzugefügt. Sowohl meine als auch LaurenceDawson sollten funktionieren. –

3

Wann instanziieren Sie Ihre Helper-Klasse? Stellen Sie sicher, dass es nach onActivityCreated() im Lebenszyklus des Fragments ist.

http://developer.android.com/images/fragment_lifecycle.png

Das sollte folgende Code arbeiten:

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    helper = new Helper(getActivity()); 
    } 
1

getActivity() kann null zurückgeben, wenn es aufgerufen wird, bevor onAttach() aufgerufen wird. Ich würde so etwas wie dies empfehlen:

public class Fragment extends SherlockFragment { 

    private Helper helper; 

    // Other code 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     helper = new Helper(activity); 
    } 
}