2013-08-09 15 views
8

Ho una domanda riguardante l'utilizzo del contesto in un frammento. Il mio problema è che ottengo sempre una NullpointerException. Ecco cosa devo fare:Perché il mio contesto nel mio frammento è nullo?

Creare una classe che estenda SherlockFragment. In questa classe ho un'istanza di un'altra classe Helper:

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

    // More code ... 
} 

Ecco un estratto della altra classe Helper:

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

Ogni volta che io chiamo context.someMethod (ad es context.getResources()) ottengo una NullPointerException. Perché?

+0

Sembra 'SherlockFragment # activity' non è impostato durante l'inizializzazione il tuo frammento, ma iniettato in una fase successiva, essendo così' null' nel costruttore. –

risposta

16

Si sta tentando di ottenere un Context quando il Fragment viene prima un'istanza. A quel tempo, NON è collegato a un Activity, quindi non esiste uno Context valido.

Dai uno sguardo allo Fragment Lifecycle. Tutto ciò che va da onAttach() a onDetach() contiene un riferimento a un'istanza di contesto valida. Questa istanza contesto è di solito recuperato tramite getActivity()

esempio di codice:

private Helper mHelper; 

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

ho usato onAttach() nel mio esempio, @LaurenceDawson utilizzato onActivityCreated(). Nota le differenze Dal onAttach() è già passato un Activity, non ho usato getActivity(). Invece ho usato l'argomento passato. Per tutti gli altri metodi nel ciclo di vita, è necessario utilizzare getActivity().

+0

puoi darmi qualche consiglio per l'implementazione del mio codice? – user2426316

+0

@ user2426316 Ho aggiunto un esempio. Sia il mio che LaurenceDawson dovrebbero funzionare. –

3

Quand'è che instanziate la classe di Helper? Assicurati che sia dopo onActivityCreated() nel ciclo di vita del frammento.

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

Il seguente codice dovrebbe funzionare:

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

getActivity() può restituire null se viene chiamato prima che venga chiamato onAttach(). Vorrei raccomandare qualcosa di simile:

public class Fragment extends SherlockFragment { 

    private Helper helper; 

    // Other code 

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