2015-12-27 2 views
5

J'utilise supportMapFragment intérieur fragment ce pourquoi je me sers this.getChildFragmentManager() si ce mal s'il vous plaît me guiderÉchec d'état d'économie: SupportMapFragment active {} a autorisé l'index: -1

public static ClinicFragment newInstance() { 
     ClinicFragment fragment = new ClinicFragment(); 
     return fragment; 
    } 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     setTargetFragment(null , -1); // one of my tries 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.activity_maps, null, false); 

     Log.i(TAG , "onCreateView"); 

     mapFragment = (SupportMapFragment) this.getChildFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     mapUtils = new MapUtils(getActivity()); 
     ....... 
     return view; 
    } 


@Override 
    public void onMapReady(com.google.android.gms.maps.GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.setMyLocationEnabled(true); 
     mMap.getUiSettings().setZoomControlsEnabled(true); 
     mMap.setOnMarkerClickListener(this); 
    } 

@Override 
public void onPause() { 
    super.onPause(); 
    mapUtils.removeUpdate(mMap); // this helper class handle change location listener 
    Log.i(TAG, "onPause"); 
} 
@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    Log.i(TAG, "onDestroyView"); 

} 

@Override 
public void onStop() { 
    super.onStop(); 
    Log.i(TAG, "onStop"); 

    killOldMap(); 
} 

//remove map fragment when view disappeared 
private void killOldMap() { 
    try{ 
     SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager() 
       .findFragmentById(R.id.map)); 
     if(mapFragment != null) { 
      FragmentManager fM = getFragmentManager(); 
      fM.beginTransaction().remove(mapFragment).commit(); 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 

    } 

} 

Mon journal

java.lang.IllegalStateException: Failure saving state: active SupportMapFragment{1ba0fd93} has cleared index: -1 
at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1824) 
at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:2111) 
at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1767) 
at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1835) 
at android.support.v4.app.FragmentController.saveAllState(FragmentController.java:125) 
at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:523) 
at android.app.Activity.performSaveInstanceState(Activity.java:1297) 
at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1272) 
at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:3923) 
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3334) 
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3390) 
at android.app.ActivityThread.access$1100(ActivityThread.java:144) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Je peux décrire mon erreur qu'il essaie de supprimer le fragment de la carte, mais il ne peut pas trouver la référence

My Tries

1- Après de longues recherches, j'ai trouvé la méthode setTargetFragment(null , -1);.

2- Tuer un fragment dans onStop.

mais tout cela essaie Ne me aider à corriger mon problème, quelqu'un peut me guider pourquoi je manque

+0

Vous ne pouvez pas changer toute la question, spécialement quand quelqu'un consacre du temps et de l'énergie à votre question.Veuillez jeter un coup d'oeil à cette http://meta.stackoverflow.com/questions/290297/how-much-change-to-the -question-is-too-much –

Répondre

4

Je ne me public static ClinicFragment newInstance()

J'utilise des fragments qui sont attachés à l'exemple des activités. Je ne comprends pas pourquoi vous tuez votre fragment de carte. Je n'ai jamais eu le besoin de le faire, et juste permis au cycle de vie de l'activité naturelle de gérer la destruction de la plupart des choses.

Vous appelez également la super méthode onDestroy avant votre killOldMap, ce qui signifie que l'ordre des tâches détruites dans la super méthode sera appelé avant la méthode killOldMap. Cela peut également laisser des ressources suspendues sans activité attachée.

Override 
public void onStop() { 
    super.onStop(); 
    Log.i(TAG, "onStop"); 

    killOldMap(); 
} 

Donc, il y a deux façons de gérer ceci:

Retrait du fragment provoque le fragment à détruire, sans la nécessité d'utiliser votre méthode kill:

getActivity().getSupportFragmentManager().beginTransaction().remove(this) 
       .commit(); 

Le J'utilise fragmentTransaction.replace(R.id.yourId, fragment)

Personnellement, j'aime l'idée d'utiliser un framelayout dans ma disposition d'activité, puis de basculer la visibilité entre la carte et le autre fragment, je ne détruis pas la carte, c'est là pour revenir avec toutes les coordonnées que je cherche. Cela ne fait aucun mal si je gère bien les services de localisation. Ceci est un choix de conception que j'utilise et en aucun cas la loi.

Je gère les appels de localisation avec la visibilité des fragments dans ce framelayout. Création d'une méthode personnalisée:

public void hideFrames() { 
    frameLayout2.setVisibility(View.GONE); 
    frameLayout3.setVisibility(View.GONE); 
} 

De cette façon, le framelayout gère la visibilité de la carte.

<RelativeLayout .../... 
      android:id="@+id/main"> 

    <TextView 
     android:id="@+id/t1" 
    .../.../> 


    <FrameLayout 
     android:id="@+id/framelayout1" 
     android:layout_below="@+id/t1" 
     android:layout_height="fill_parent" 
     android:layout_width="match_parent" 
     android:visibility="gone"/> 
    <FrameLayout 
     android:id="@+id/framelayout2" 
     android:layout_below="@+id/t1" 
     android:layout_height="fill_parent" 
     android:layout_width="match_parent" 
     android:visibility="gone"> 

     <fragment 
      android:id="@+id/map" 
      android:layout_height="fill_parent" 
      android:layout_width="match_parent" 
      android:name="com.google.android.gms.maps.MapFragment"/> 
    </FrameLayout> 
</RelativeLayout> 

et vous pouvez avoir vos méthodes dans votre activité parent et appelez de vos fragments:

public void replaceFragment(Fragment fragment) { 
    hideFrames(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.YourId, fragment); 
    fragmentTransaction.commit(); 
} 

et il est appelé à partir de chaque fragment attaché à l'activité comme ceci:

// create new fragment 
((MainActivity) getActivity()).replaceFragment(fragment); 

En outre:

Il existe un problème connu avec ce

Fix issue #6584942 IllegalStateException: état d'économie d'échec ...

... SuggestFragment active {419494f0} a dégagé index: -1

Il y avait des problèmes quand le même fragment a été enlevé puis ajouté à nouveau avant complètement fin de la suppression (comme dû à une animation en cours d'exécution).

+0

Je vous remercie pour la réponse, mais je mettre à jour ma question cela peut être plus clair maintenant –

+1

@MinaFawzy questions ne devraient pas être modifiées après qu'ils ont été répondus, il gaspille le temps et les efforts des personnes qui ont répondu à la question d'origine http://meta.stackoverflow.com/questions/290297/how-much-change-to-the-question-is-too-much Vous devriez toujours trouver cette réponse utile. Comme je l'ai dit, je ne comprends pas pourquoi vous utilisez kill. J'ai édité ma réponse, merci de la relire merci –

0

Pour ceux qui veulent plus d'informations sur ce crash. Il existe des confusions entre getActivity().getSupportFragmentManager()/getChildFragmentManager()/getFragmentManager().

getActivity().getSupportFragmentManager() est l'Activity FragmentManager. getChildFragmentManager() est mon FragmentManager (mon Fragment actuel) getFragmentManager() est mon hôte FragmentManager (mon comme Fragment actuel) et donc mon ParentFragment FragmentManager si ParentFragment n'est pas nul, ou mon FragmentManager Activity. Veillez donc à toujours utiliser le même FragmentManager.

Dans la question, on peut lire:

mapFragment = (SupportMapFragment) this.getChildFragmentManager() .findFragmentById(R.id.map);

Et

SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.map)); if(mapFragment != null) { FragmentManager fM = getFragmentManager(); fM.beginTransaction().remove(mapFragment).commit(); }

Le MapFragment est jamais supprimé puisque nous utilisons notre FragmentManager hôte pour l'enlever et le ChildFragmentManager trouver il.

0

Vous supprimez le mauvais Fragment (fragment de carte), vous devez supprimer le fragment "ClinicFragment".