2013-07-22 11 views
2

J'ai 3 onglets fragment, fragment1, fragment2 et fragment3. J'ai créé un autre fragment d'onglets dans fragment2. Le problème est chaque fois que je resélectionne fragment2 qui contient des onglets fragmentés, mon application tombe en panne avec le LOGCAT montré ci-dessous. J'ai suivi une question dans stackoverflow sur ce lien Getting the error "Java.lang.IllegalStateException Activity has been destroyed" when using tabs with ViewPager mais il ne semble pas fonctionner non plus. Aussi, est-ce que j'importe la bonne bibliothèque "import java.lang.reflect.Field;"?FragmentTabHost "L'activité a été détruite"

fragment2.java

import com.actionbarsherlock.app.SherlockFragment; 
import android.os.Bundle; 
import android.support.v4.app.FragmentTabHost; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class Fragment2 extends SherlockFragment{ 
    private FragmentTabHost mTabHost; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

      mTabHost = new FragmentTabHost(getSherlockActivity()); 
      mTabHost.setup(getSherlockActivity(), getChildFragmentManager(), R.layout.fragmenttab2); 

      mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"), 
        Fragment1.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"), 
        Fragment2.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"), 
        Fragment3.class, null); 

      return mTabHost; 
     } 

     @Override 
     public void onDestroyView() { 
      super.onDestroyView(); 
      mTabHost = null; 
     } 


} 

LogCat:

07-22 16:18:50.668: E/AndroidRuntime(29774): FATAL EXCEPTION: main 
07-22 16:18:50.668: E/AndroidRuntime(29774): java.lang.IllegalStateException: Activity has been destroyed 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:278) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.View.dispatchAttachedToWindow(View.java:9953) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2198) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2206) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.addViewInner(ViewGroup.java:3376) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.addView(ViewGroup.java:3208) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.addView(ViewGroup.java:3165) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.view.ViewGroup.addView(ViewGroup.java:3145) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:922) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.os.Handler.handleCallback(Handler.java:605) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.os.Looper.loop(Looper.java:137) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at android.app.ActivityThread.main(ActivityThread.java:4507) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at java.lang.reflect.Method.invokeNative(Native Method) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at java.lang.reflect.Method.invoke(Method.java:511) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
07-22 16:18:50.668: E/AndroidRuntime(29774): at dalvik.system.NativeStart.main(Native Method) 

Répondre

0

En écrivant ce code:

Field childFragmentManager = Fragment2.class.getDeclaredField("mChildFragmentManager"); 

signifie que vous wan pour obtenir le dépôt vous en Fragment2 déclarée.

et je peux voir le champ mChildFragmentManager dans Fragment2.

Si vous êtes sûr que ce dépôt est déclarée en super classe, vous devez utiliser Fragment2.class.getField

+0

essayer de remplacer Fragment2.class.getDeclaredField ("mChildFragmentManager"); par Fragment2.class.getField ("mChildFragmentManager"); – kvh

+0

désolé, essayez getField – kvh

+0

J'ai eu l'erreur dans mon logcat. hmm, une solution de contournement? –

0

Essayez ceci pour votre childFragmentManager

childeFragmentManager = getChildFragmentManager().

Il a été ajouté à l'appui bibliothèque après la publication de 4.2 car les fragments imbriqués n'étaient pas supportés avant cela.

Source http://developer.android.com/about/versions/android-4.2.html#NestedFragments

+0

Désolé, puis-je savoir où dois-je mettre ceci? –

+0

Désolé, vous avez modifié votre question. Lors de votre dernière édition, vous utilisiez la réflexion ('Field') pour trouver' FragmentManager' dans 'onDetach()'. Donc, au lieu de cela, utilisez ceci. Je ne sais pas comment vous ajoutez un fragment d'enfant à l'intérieur de votre fragment. Mais n'utilisez pas 'getFragmentManager()' pour ajouter un fragment à l'intérieur de votre fragment, utilisez à la place 'getChildFragmentManager()'. – vKashyap

Questions connexes