android – 一些片段在旋转时丢失

android – 一些片段在旋转时丢失,第1张

概述在我的FragmentActivity中,我使用了几个片段.当配置改变时(旋转时),系统会破坏并重新创建每个片段. 我尝试使用这个重新创建的片段 mFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_frame); 并把它放到新的布局 getSupportFragmentManager().beginTrans 在我的FragmentActivity中,我使用了几个片段.当配置改变时(旋转时),系统会破坏并重新创建每个片段.
我尝试使用这个重新创建的片段

mFragment = getSupportFragmentManager().findFragmentByID(R.ID.fragment_frame);

并把它放到新的布局

getSupportFragmentManager().beginTransaction()    .replace(R.ID.fragment_frame,mFragment )           .commit();

但遇到奇怪的行为:丢失了几个碎片.它们不会更多地显示在屏幕上.在他们的位置是空的.
虽然日志显示片段重新创建正常,但进一步显示片段再次被破坏,再次创建和销毁.

我为展示问题建立了更清晰,没有外壳的测试项目.
并且有明显的结果(插入图片的声誉不够)
Activity started picture
Activity rotated picture

A,B,C,D是片段
正如您在配置更改后看到的那样,一些片段丢失了(B,D)

告诉我我做错了什么

这是帮助的代码(编辑:将代码推送到gitHub以便更容易尝试)

https:// github.com/nailgilazIEv/TestFragmentsRetain

p / s抱歉链接

旋转设备后,这里记录猫

MainActivity: onPause ActivityMainActivity: onStop ActivityMainActivity: onDestroy ActivityA: onDestroyvIEwA: onDestroyB: onDestroyvIEwB: onDestroyC: onDestroyvIEwC: onDestroyD: onDestroyvIEwD: onDestroyMainActivity: onCreate ActivityA: onCreateB: onCreateC: onCreateD: onCreateMainActivity: replacedMainActivity: onStart ActivityA: onCreateVIEwB: onCreateVIEwC: onCreateVIEwD: onCreateVIEw<--before this point all fine and then strange behavior beganfor the lost fragments(B,D) are performed unnecessary calls-->B: onDestroyvIEwB: onDestroyD: onDestroyvIEwD: onDestroyD: onCreateD: onCreateVIEwMainActivity: onResume Activity
解决方法 通过分解您的问题,使得有两个片段而不是四个,您将看到onCreateVIEw在方向更改时在同一片段上多次被调用.这表明同一片段被添加/创建不止一次.

基本上,当方向更改时,您的Fragments将自动重新附加,因此每次调用onCreate(Bundle)时都不需要执行FragmentTransaction.

你应该在onCreate(Bundle)上做什么呢……

> Null检查传入onCreate(Bundle)的savedInstanceState Bundle. – 如果发生方向更改,则再次调用onCreate(Bundle)并且savedInstanceState Bundle将变为非null. FragmentActivity在重新创建之前将数据保存在onSaveInstanceState(Bundle)中.
>如果savedInstanceState为null,则创建片段并通过FragmentTransaction附加它们.否则,什么也不做.

总之,您修改后的代码应该类似于以下内容……

FragmentManager fm = getSupportFragmentManager();if(savedInstanceState == null) {    fm.beginTransaction()            .replace(R.ID.a,new A())            .replace(R.ID.b,new B())            .replace(R.ID.c,new C())            .replace(R.ID.d,new D())            .commit();}else {    a = fm.findFragmentByID(R.ID.a);    b = fm.findFragmentByID(R.ID.b);    c = fm.findFragmentByID(R.ID.c);    d = fm.findFragmentByID(R.ID.d);}

另外,请注意,Fragment的onCreate(Bundle)方法中的savedInstanceState Bundle将始终为null,除非您在onSaveInstanceState(Bundle)中保存了一些内容,因此不要假设saveInstanceState在片段中也是非null的当它被重新创建时,就像FragmentActivity的情况一样.

总结

以上是内存溢出为你收集整理的android – 一些片段在旋转时丢失全部内容,希望文章能够帮你解决android – 一些片段在旋转时丢失所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1122019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存