ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-29 01:28:00  阅读:204  来源: 互联网

标签:android android-fragments rotation android-lifecycle


在我的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 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

解决方法:

通过分解您的问题,使得有两个片段而不是四个,您将看到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-fragments,rotation,android-lifecycle
来源: https://codeday.me/bug/20190729/1567424.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有