2015-02-09 15 views
17

Ich erstelle einen Array-Adapter für eine Listenansicht, alles funktioniert ok, ich habe 2 Fragmente und 2 Schaltflächen an der Spitze der Aktionsleiste, die zwischen diesen 2 Fragmente ändert. Mein Problem ist, dass ich Abstürze bekomme, wenn ich mich zu schnell zwischen diesen Frags bewege, wenn ich fragOne öffne, zu fragTwo wechsle und dann schnell zurück zu fragOne. FragOne wirft eine NPE aus dem getActivity-Kontext.Android - NullPointerException von der Erstellung eines Adapters

das ist dass die Linie abstürzt:

adapter = new MainFragmentDocumentAdapter(getActivity(), docsList, DocumentsFragment.this, page); 

den Protokollbericht:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.bbb.app, PID: 17438 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
     at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104) 
     at com.bbb.app.UI.adapters.MainFragmentDocumentAdapter.<init>(MainFragmentDocumentAdapter.java:51) 

eine Ahnung, wie kann ich lösen dieses Problem?

+4

Sie erhalten Abstürze wegen der Fragment-Lebenszyklus Probleme, die bewirkt manchmal, dass getActivity() null ist. – jvrodrigues

+2

getApplicationContext() ist nicht optimal, da im Adapter nichts formatiert wird. Entweder ContextThemeSchließen Sie den Anwendungskontext mit dem App-Design ein, oder machen Sie den Adapter zu einem globalen Objekt, damit das Fragment nicht erneut instanziiert wird und Ihre App nicht abstürzt. – jvrodrigues

+0

jvrodrigues danke für deine antwort, könntest du ein bisschen mehr darüber erzählen? Ich habe es nicht vollständig verstanden, danke! – JozeRi

Antwort

43

Also im Grunde nach vielen Überprüfungen fand ich heraus, dass das Problem war, dass ich zu diesem Fragment innerhalb eines anderen Fragments zurückkehrte, weil ich einen Zuhörer hatte, der darauf hinwies und versuchte, diese Methode zu öffnen.

im Grunde wickelte ich es nur in einem gelöst

if (getActivity() != null) { 
    // Code goes here. 
} 

und Problem.

Vielen Dank für alle Hilfe Jungs!

+0

Wo stellst du das hin? Ich kann die Return-Anweisung damit nicht umbrechen. – grant

+0

Ich hatte ein ähnliches Problem, das ich 2 Tage versuchte zu lösen. Danke, dass Sie sich die Zeit genommen haben, die Lösung für Ihre Frage zu veröffentlichen. – Nikaoto

+0

Bitte geben Sie an, wo Sie diesen Code platzieren sollen? –

-1

Probieren catch-Block, es funktionierte für mich

1

Sie so tun können.

innen Aktivität

public static UsageRecommendationTabActivity getInstance() { 
     return activityInstance; 
    } 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
activityInstance=this; 
} 

innerhalb Fragment

@Override 
    public void onAttach(Activity activity) { 
     // TODO Auto-generated method stub 
     super.onAttach(activity); 
     if (activity instanceof UsageRecommendationTabActivity) 
      mParentActivity = (UsageRecommendationTabActivity) activity; 
     if (mParentActivity == null) 
      mParentActivity = UsageRecommendationTabActivity.getInstance(); 
    } 

und dann rufen Sie Ihren Adapter

adapter = new MainFragmentDocumentAdapter(mParentActivity, docsList, DocumentsFragment.this, page); 
+0

interessante Idee! werde es versuchen – JozeRi

2

wenn Sie auf einem Fragment Prüfung sind, wenn das Fragment hinzugefügt wird. !

{ 
    ... 

    if (!this.isAdded()) { //this = current fragment 
     return; 
    } 
    LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 
    ... 
} 
0

Add für getContext Überprüfung() = null

Bevor Block

mAdapter = new SimpleHomeItemAdapter(getActivity(), mList); 
listview.setAdapter(mAdapter); 

Zum Beispiel:

if (getActivity()!=null){ 

mAdapter = new SimpleHomeItemAdapter(getActivity(), mList); 
listview.setAdapter(mAdapter); 

} 
Verwandte Themen