nai*_*ail 3 android rotation android-lifecycle android-fragments
我用FragmentActivity我的几个碎片.当配置改变时(旋转时),系统会破坏并重新创建每个片段.
我尝试使用这个重新创建的片段
mFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_frame);
Run Code Online (Sandbox Code Playgroud)
并把它放到新的布局
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_frame, mFragment )
.commit();
Run Code Online (Sandbox Code Playgroud)
但遇到奇怪的行为:丢失了几个碎片.它们不会更多地显示在屏幕上.在他们的位置是空的.
虽然日志显示片段重新创建正常,但进一步显示片段再次被破坏,再次创建和销毁.
我为展示问题建立了更清晰,没有外壳的测试项目.
并且可以证明结果(插入图片的声誉不够)
活动开始图片
活动旋转图片
A,B,C,D是一个fragments
如你所见,配置改变后一些片段丢失(B,D)
告诉我我做错了什么
这是帮助的代码(编辑:将代码推送到gitHub以便更容易尝试)
https:// github.com/nailgilaziev/TestFragmentsRetain
Run Code Online (Sandbox Code Playgroud)
p/s抱歉链接
旋转设备后,这里记录猫
MainActivity: onPause Activity
MainActivity: onStop Activity
MainActivity: onDestroy Activity
A: onDestroyview
A: onDestroy
B: onDestroyview
B: onDestroy
C: onDestroyview
C: onDestroy
D: onDestroyview
D: onDestroy
MainActivity: onCreate Activity
A: onCreate
B: onCreate
C: onCreate
D: onCreate
MainActivity: replaced
MainActivity: onStart Activity
A: onCreateView
B: onCreateView
C: onCreateView
D: onCreateView
<--before this point all fine and then strange behavior began
for the lost fragments(B,D) are performed unnecessary calls-->
B: onDestroyview
B: onDestroy
D: onDestroyview
D: onDestroy
D: onCreate
D: onCreateView
MainActivity: onResume Activity
Run Code Online (Sandbox Code Playgroud)
通过分解您的问题,使得有两个片段而不是四个,您将看到onCreateView在方向更改时在同一片段上多次调用.这表明同一片段被添加/创建不止一次.
基本上,当方向发生变化时,您的碎片将自动重新附加,因此无需FragmentTransaction每次onCreate(Bundle)调用都执行.
你应该做的onCreate(Bundle)是......
Null检查savedInstanceState传入的Bundle onCreate(Bundle).- 如果发生方向更改,则onCreate(Bundle)再次调用,savedInstanceStateBundle将变为非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);
}
Run Code Online (Sandbox Code Playgroud)
另外,请注意,a方法中的savedInstanceStateBundle 将始终为null,除非您在其中保存了某些内容,因此不要假设在重新创建它时也将为非null ,因为它在一个案例.onCreate(Bundle)FragmentonSaveInstanceState(Bundle)saveInstanceStateFragmentFragmentActivity
| 归档时间: |
|
| 查看次数: |
4014 次 |
| 最近记录: |