2015-03-11 15 views
5

In base al ciclo di vita del frammento Android, mi aspetto che dopo onDestroy venga ricreato il frammento o che venga richiamato almeno lo onCreateView.Frammento Android onCreateView dopo onDestroy non richiamato

ho avere un'attività A partire un'altra attività B per il risultato e attività B creando un frammento F.

public class A extends FragmentActivity { 
    ... 
    public void onButonClick() { 
     Intent intent = new Intent(this, B.class); 
     startActivityForResult(intent, REQUEST_B); 
    } 
} 

public class B extends FragmentActivity { 
    ... 

    public void onCreate(Bundle savedInstanceState) { 
      ... 
      this.currentFragment = Fragment.instantiate(this, name); 
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(this.view.getFragmentContainerId(), this.currentFragment, taskName); 
      transaction.commit(); 
    } 
} 

public class F extends Fragment { 
    @override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     this.view = new MyView(); 
    } 

    @override 
    public void onResume() { 
     this.view.doSomething(); 
    } 

    @override 
    public void onDestroy() { 
     this.view = null; 
    } 

} 

Quando il frammento è stato creato prima volta tutto è ok, è mostrata la vista. Lasciando l'applicazione (come andare in impostazioni di sistema) ha l'effetto che onDestroy del frammento è chiamato senza onDestroyView che viene chiamato, ma quando tornerò al mio app onCreateView ist non chiamato di nuovo che provoca una NullPointerException perché io sto istanziando la vista solo in onCreateView. Reimpostare la vista in onDestroyView penso che risolveremmo il problema, ma voglio sapere cosa c'è di sbagliato qui con il ciclo di vita e se sto facendo qualcosa di sbagliato.

Grazie.

Ecco l'output del logcat.

03-11 11:22:47.565 6594-6594/com.xy.android.app I/ActivityA Perform button click. 
    03-11 11:22:47.595 6594-6594/com.xy.android.app V/ActivityA Pausing activity 
    03-11 11:22:47.605 6594-6594/com.xy.android.app D/ActivityB Creating activity 
    03-11 11:22:48.075 6594-6594/com.xy.android.app V/ActivityB Starting activity 
    03-11 11:22:48.105 6594-6594/com.xy.android.app I/ActivityB Resuming activity 
    03-11 11:22:48.476 6594-6594/com.xy.android.app I/ActivityB Starting task FragmentF. 
    03-11 11:22:48.536 6594-6594/com.xy.android.app I/FragmentF Attached to activity. 
    03-11 11:23:02.350 6594-6594/com.xy.android.app I/FragmentF Creating fragment 
    03-11 11:23:02.390 6594-6594/com.xy.android.app I/FragmentF Creating view for fragment 
    03-11 11:23:02.420 6594-6594/com.xy.android.app V/FragmentF View for fragment created 
    03-11 11:23:02.430 6594-6594/com.xy.android.app D/FragmentF Activity created. 
    03-11 11:23:02.441 6594-6594/com.xy.android.app V/FragmentF Starting fragment 
    03-11 11:23:02.741 6594-6594/com.xy.android.app V/ActivityA Saving activity instance state. 
    03-11 11:23:02.761 6594-6594/com.xy.android.app I/ActivityA Stopping activity 
    03-11 11:23:07.686 6594-6594/com.xy.android.app V/FragmentF Pausing fragment. 
    03-11 11:23:07.696 6594-6594/com.xy.android.app V/ActivityB Pausing activity 
    03-11 11:23:08.517 6594-6594/com.xy.android.app D/FragmentF Save instance state. 
    03-11 11:23:08.567 6594-6594/com.xy.android.app D/ActivityB Saving activity instance state. 
    03-11 11:23:08.597 6594-6594/com.xy.android.app I/FragmentF **Destroying fragment** 
    03-11 11:23:08.627 6594-6594/com.xy.android.app I/ActivityB Stopping activity 
    03-11 11:23:14.033 6594-6594/com.xy.android.app V/FragmentF Starting fragment 
    03-11 11:23:14.043 6594-6594/com.xy.android.app V/ActivityB Starting activity 
    03-11 11:23:14.063 6594-6594/com.xy.android.app I/ActivityB Resuming activity 
    03-11 11:23:14.063 6594-6594/com.xy.android.app I/FragmentF **Resuming fragment** 
+0

inizializza la vista in 'onViewCreated()' invece di 'onCreateView()' –

+0

this.currentFragment = Fragment.instantiate (this, name); Perché stai installando il tuo frammento come questo invece del costruttore predefinito? prova F fragment = new F(); –

+0

Immagino che lo startactivityForResult() possa essere un colpevole e ti sei perso i super-call che hai sovrascritto nel tuo frammento? –

risposta

1

Dopo aver investigato un po 'di tempo ho finalmente "risolto" il problema creando la vista in onCreateView e distruggerlo in onDestroyView, senza capire perché il sistema non chiama la richiamata come descritto nella documentazione di SDK.

Problemi correlati