Fragmentation icon indicating copy to clipboard operation
Fragmentation copied to clipboard

java.lang.IllegalAccessError: Field 'androidx.fragment.app.FragmentManager.mStateSaved' is inaccessible to class

Open aylgyfqc opened this issue 5 years ago • 7 comments

Issues Guideline

Following information can help us to resolve the issue faster. java.lang.IllegalAccessError: Field 'androidx.fragment.app.FragmentManager.mStateSaved' is inaccessible to class 'androidx.fragment.app.FragmentationMagician' (declaration of 'androidx.fragment.app.FragmentationMagician' appears in /data/app/com.ytj.ivpn-zgzU8DPispqblDe0A9FZAw==/base.apk)

  • Library version
  • Support-v4 version
  • Logs
  • Screenshots

In addition, we do not accept issues unrelated to Fragmentation.

aylgyfqc avatar Oct 16 '19 09:10 aylgyfqc

java.lang.IllegalAccessError: Field 'androidx.fragment.app.FragmentManager.mStateSaved' is inaccessible to class 'androidx.fragment.app.FragmentationMagician' (declaration of 'androidx.fragment.app.FragmentationMagician' appears in /data/app/com.ytj.ivpn-zgzU8DPispqblDe0A9FZAw==/base.apk)

aylgyfqc avatar Oct 16 '19 09:10 aylgyfqc

想不明白为什么,突然这样了,啥也没改过

aylgyfqc avatar Oct 16 '19 09:10 aylgyfqc

loadMultipleRootFragment(R.id.frameLayout,0,allFragment,successFragment,cancelFragment)

aylgyfqc avatar Oct 16 '19 09:10 aylgyfqc

使用这个implementation 'me.yokeyword:fragmentation:1.3.7'依赖的代码

跟下载的代码不一样额。。。。

aylgyfqc avatar Oct 16 '19 09:10 aylgyfqc

依赖 androidx.fragment:fragment:1.2.0+ 会有这个问题, 1.2.0版本之后将FragmentManager中的变量mStateSaved变为private,所有的逻辑从FragmentManagerImpl移到了FragmentManager。 可修改依赖版本为androidx.fragment:fragment:1.1.0解决这个问题,希望作者早日适配fragment1.2.0

chaichuanfa avatar May 15 '20 06:05 chaichuanfa

可以引用源码,修改FragmentationMagician中的hookStateSaved方法如下: private static void hookStateSaved(FragmentManager fragmentManager, Runnable runnable) { if (!(fragmentManager instanceof FragmentManagerImpl)) return;

    if (isStateSaved(fragmentManager)) {
        try {
            Log.d("lyx","通过反射获取私有属性mStateSaved");
            Class<? extends FragmentManager> aClass = fragmentManager.getClass();
            Field mStateSavedField = aClass.getDeclaredField("mStateSaved");
            mStateSavedField.setAccessible(true);
            Log.d("lyx","通过反射获取私有属性mStateSaved,并设置属性可访问");
            Log.d("lyx","通过反射获取私有属性mStopped");
            Field mStoppedField = aClass.getDeclaredField("mStopped");
            mStoppedField.setAccessible(true);
            Log.d("lyx","通过反射获取私有属性mStopped,并设置属性可访问");
            boolean tempStateSaved = (boolean) mStateSavedField.get(fragmentManager);
            boolean tempStopped = (boolean) mStoppedField.get(fragmentManager);
            Log.d("lyx","设置私有属性mStateSaved == false");
            Log.d("lyx","设置私有属性mStopped == false");
            mStateSavedField.setBoolean(fragmentManager, false);
            mStoppedField.setBoolean(fragmentManager, false);

            runnable.run();
            mStateSavedField.setBoolean(fragmentManager, tempStateSaved);
            mStoppedField.setBoolean(fragmentManager, tempStopped);
            Log.d("lyx","设置私有属性mStateSaved == "+tempStateSaved);
            Log.d("lyx","设置私有属性mStopped == "+tempStopped);
        } catch (Exception e) {
            Log.e("lyx", "hookStateSaved: 发生异常,异常信息:"+e.getMessage());
            e.printStackTrace();
        }
    } else {
        runnable.run();
    }
}

liyaxun520 avatar Sep 26 '23 06:09 liyaxun520

这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

esirong avatar Sep 26 '23 06:09 esirong