causing a java.IllegalStateException error, No Activity, only when navigating to Fragment for the SECOND time

前端 未结 8 1305
感动是毒
感动是毒 2020-12-08 06:39

I am getting a very puzzling bug that I have no idea how to even begin working through.

I have a simple app with one activity, the views are implemented with Fragme

相关标签:
8条回答
  • 2020-12-08 07:38

    Refer @lopisan answer:

    I use his solution for a long time.

    BUT I figure out have a better way to do this!

    If mChildFragmentManager.mActivity is null, then set mChildFragmentManager to null. When performActivityCreated method.

    @Override
    void performActivityCreated(Bundle savedInstanceState) {
        if (getFragmentManagerActivity(mChildFragmentManager) == null) {
            setChildFragmentManager(this, null);
        }
        super.performActivityCreated(savedInstanceState);
    }
    
    
    public static FragmentActivity getFragmentManagerActivity(FragmentManager fragmentManager) {
        FragmentManagerImpl fm = (FragmentManagerImpl) fragmentManager;
        return fm.mActivity;
    }
    
    
    
    private static final Field sChildFragmentManagerField;
    static {
        /**
         * BUG : causing a java.IllegalStateException error, No Activity, only
         * when navigating to Fragment for the SECOND time
         * http://stackoverflow.com /questions/15207305/getting-the-error-java-lang-illegalstateexception-activity-has-been-destroyed
         * http://stackoverflow.com/questions/14929907/causing-a-java-illegalstateexception-error-no-activity-only-when-navigating-to
         */
        Field f = null;
        try {
            f = Fragment.class.getDeclaredField("mChildFragmentManager");
            f.setAccessible(true);
        } catch (NoSuchFieldException e) {
            Log.e(TAG, "Error getting mChildFragmentManager field", e);
        }
        sChildFragmentManagerField = f;
    }
    
    public static void setChildFragmentManager(Fragment fragment, FragmentManager fragmentManager) {
        if (sChildFragmentManagerField != null) {
            try {
                sChildFragmentManagerField.set(fragment, fragmentManager);
            } catch (Exception e) {
                Log.e(TAG, "Error setting mChildFragmentManager field", e);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 07:45

    may your error is android.view.InflateException?

    if so,you should inflate Fragment dynamically ,don't use XML layout.

    and, you should not target fragment which is defined XML Layout to Fragment Transaction.

    0 讨论(0)
提交回复
热议问题