首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Fragment在屏幕旋转时被调用两次

是因为Android系统在屏幕旋转时会销毁当前的Activity并重新创建一个新的Activity实例,而Fragment是依附于Activity的,所以也会被销毁和重新创建。

这种行为是为了适应不同屏幕方向下的布局变化和资源重新加载。当屏幕旋转时,系统会先销毁当前的Fragment实例,然后重新创建一个新的Fragment实例并添加到新创建的Activity中。

这种行为可能会导致一些问题,比如数据的丢失或重复加载。为了解决这些问题,可以通过以下方法来处理:

  1. 保存和恢复数据:可以在Fragment中重写onSaveInstanceState()方法,在其中保存需要保留的数据,并在onCreate()onCreateView()方法中恢复数据。这样可以避免数据的丢失。
  2. 使用setRetainInstance()方法:可以在Fragment中调用setRetainInstance(true)方法,使Fragment在屏幕旋转时保留实例。这样可以避免Fragment的销毁和重新创建,但需要注意处理好与Activity的生命周期的关系。
  3. 使用ViewModel:可以使用Android Architecture Components中的ViewModel来保存和管理数据。ViewModel会在屏幕旋转时保持数据的一致性,不受Fragment的销毁和重新创建影响。
  4. 使用FragmentTransaction的addToBackStack()方法:可以在FragmentTransaction中调用addToBackStack(null)方法,将Fragment添加到返回栈中。这样在屏幕旋转时,Fragment会被暂时保存在返回栈中,不会被销毁,可以在需要时重新显示。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mmp
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器:https://cloud.tencent.com/product/cvm
  • 腾讯云云原生应用引擎:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云存储:https://cloud.tencent.com/product/cos
  • 腾讯云区块链:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/ue
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

,当用户旋转屏幕会重新启动。...注:这里也没有考虑加载旋转屏幕,问题与上面的一致。...从效果图可以看到,无论如何旋转不会重启Activity. 效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始所说的,当异步任务执行时,进行旋转,如果解决上面的问题。...下面我们希望有一种解决方案:加载数据旋转屏幕,不会对加载任务进行中断,且对用户而言,等待框在加载完成之前都正常显示: 当然我们还使用Fragment进行数据保存,毕竟这是官方推荐的: OtherRetainedFragment...传入新的Activity,我们会在再次打开一个加载框,当然了因为屏幕旋转并不影响加载的数据,所有后台的数据一直继续加载。

2.1K20

Android应用开发:屏幕旋转的非中断保存之setRetaineInstance

熟悉Fragment的开发人员都知道,Fragment是依附于Activity的。当Activity销毁Fragment会随之销毁。...而当Activity配置发生改变(如屏幕旋转)时候,旧的Activity会被销毁,然后重新生成一个新屏幕旋转状态下的Activity,自然而然的Fragment也会随之销毁后重新生成,而新生成的Fragment...生命周期 Activity的生命周期配置发生改变: onPuase->onStop->onDestroy->onStart->onResume 比如在Activity中发生屏幕旋转,其生命周期就是如此...和onActivityCreated还是会被调用。...需要注意的是,要使用这种操作的Fragment不能加入backstack后退栈中。并且,保存的Fragment实例不会保持太久,若长时间没有容器承载它,也会被系统回收掉的。

75620

Android OpenGL开发实践 - 基于OpenGL ES 2.0的Android相机实时图片涂鸦实现思路

有了一个人脸检测的SDK,能够得到相机预览每帧人脸屏幕中的坐标及旋转角度。...这是刚接触Shader很容易会产生的疑惑之一,实际上,Shader代码会被OpenGL反复调用多次,每画一个点就会调用一次,a_Position就代表当前要画的点,反复不停地调用,a_Position...这里有一点需要注意的是,假设涂鸦画布的实际尺寸是600*600,它随人脸进行缩放后,它的实际尺寸仍然是600*600,只不过显示的时候缩放了,因此将触摸点转换成涂鸦画布上的对应点,仍要按涂鸦画布是...之前说过,涂鸦画布实际使用的时候,会设置成比屏幕大一些,以确保人脸缩小后,画布不至于跟着缩小至比屏幕还小,不然有些地方就涂不上去了,将涂鸦画布设大,可以把它的实际尺寸设大,也可以是把它进行显示放大...现在可以将手指在屏幕上触摸onTouchEvent()回调中所得到的触摸坐标正确地转换成涂鸦画布中的坐标了,那么如何在对应的坐标点画涂鸦图案呢?

7K130

android推荐使用dialogFrament而不是alertDialog

DialogFragmentandroid 3.0引入。是一种特殊的Fragment,用于Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。...2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以屏幕和小屏幕显示出不同的效果)。...左边为模拟器,右边为我的手机~~~~~ 7、屏幕旋转 当用户输入帐号密码,忽然旋转了一下屏幕,帐号密码不见了~~~是不是会抓狂 传统的new AlertDialog屏幕旋转,第一不会保存用户输入的值...可以看到,传统的Dialog旋转屏幕就消失了,且后台log会报异常~~~使用DialogFragment则不受影响。 好了,关于DialogFragment的介绍结束~~~~ 源码点击下载

2.3K50

5. Jetpack源码解析---ViewModel基本使用及源码解析

销毁了还是屏幕旋转导致configuration发生了变化,保存在其中的数据依然存在。...基本使用 3.1 数据存储 我们参考官方Demo实现一个计时器的功能,并且演示当屏幕发生旋转,计时器会不会重新启动: DemoViewModel class DemoViewModel : ViewModel...,当我们旋转屏幕的时候你会发现,计时器的值并没有变化,仍然按照旋转之前的数值进行计数。...也就是上面提到的FragmentViewModel.java里面的clearNonConfigState()方法,而这个方法只一个地方调用了: if (DEBUG) Log.v(TAG, "movefrom...; } 这个方法是FragmentManagerImpl.java中的moveToState方法里面的,这个方法是跟随着Fragment的生命周期的,当这个方法调用时,判断两个状态beingRemoved

81920

“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

1.1 出场背景 详细介绍ViewModel前,先来看下背景和问题点。 Activity可能会在某些场景(例如屏幕旋转)销毁和重新创建界面,那么存储在其中的界面相关数据都会丢失。...看到屏幕旋转而重新创建Activity后,ViewModel对象依然会保留。只有Activity真正Finish的ViewModel才会被清除。...所以屏幕旋转等的配置改变 不会影响到这个实例?继续看这个猜想是否正确。...4.1 使用场景 我很久之前一篇文章《Activity生命周期》中有提到: onSaveInstanceState调用时机: 当某个activity变得“容易”系统销毁,该activity的onSaveInstanceState...3、按下电源按键(关闭屏幕显示)。 4、从activity A中启动一个新的activity。 5、屏幕方向切换,例如从竖屏切换到横屏

1.7K10

AndroidAutoSize使用简介

Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次...AutoSize.autoConvertDensity() //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity(...Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次...AutoSize.autoConvertDensity() //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity(...Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次

2.5K30

Android 生命周期备忘录 — 第一部分:单一 Activities

组件可以是一个 Activity,一个 Fragment,一个 Service,或者 Application 本身,甚至是默默运行的进程。组件有生命周期,生命周期会在多种状态中变换。...activity 的应用用户开启,结束,和重启发生了什么: ?...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 多窗口模式下,用户调整窗口大小 ?...场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变,这种配置变化应该能够让用户变化后继续无缝使用。...调用意图选择器,例如调用了分享对话框 ? 场景 4:应用系统暂停 这个场景不适用于以下情况: 对话框属于同一个应用。

60930

ViewModel 和 LiveData:为设计模式打 Call 还是唱反调?

ViewModel 对配置的重新加载(比如屏幕旋转)具有“抗性” ↑ 把视图层(Activity 或 Fragment)的引用传递给 ViewModel 是有 相当大的风险 的。...这样有几个好处: ViewModel 配置重新加载(比如屏幕旋转)的时候是不会变化的,所以没有必要从外部(比如网络和数据库)重新获取数据。...旋转屏幕是最明显的情况,我们已经 ViewModel 部分提到了。保存在 ViewModel 的状态是安全的。 但是,你可能需要在其他 ViewModel 也消失的场景中恢复状态。...但是,如果用户旋转手机,则新的 Activity 创建并开始观察这个字段。当对 LiveData 的观察开始,Activity 会立即收到已经使用过的值,这将导致消息再次显示!...该函数调用并且结果分发到下游。

3K30

Android 生命周期备忘录 — 第一部分:单一 Activities

组件可以是一个 Activity,一个 Fragment,一个 Service,或者 Application 本身,甚至是默默运行的进程。组件有生命周期,生命周期会在多种状态中变换。...activity 的应用用户开启,结束,和重启发生了什么: 场景 1:应用终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 结束了,你不需要保存状态...假设应用的进程没有终止,这个应用的实例会常驻在内存,保存所有状态。当这个 activity 回到前台工作,它会恢复这些状态。你不需要重新初始化这些之前已生成的组件。...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 多窗口模式下,用户调整窗口大小 场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变...调用意图选择器,例如调用了分享对话框 场景 4:应用系统暂停 这个场景不适用于以下情况: 对话框属于同一个应用。

29210

Jetpack Compose中MVVM的实现及ViewModel和remember对比

它的生命周期与调用它的组件相关联,通常是函数组件。当组件重新创建,remember 中存储的数据会丢失。...数据持久性: ViewModel: ViewModel 中的数据通常具有较长的生命周期,并且配置更改(如屏幕旋转)时会被保留。...这意味着 activity 之间导航时或进行配置更改后(例如旋转屏幕),界面将无需重新提取数据。...SideEffect 中的回调函数只 MyList 组件第一次创建调用,因为 SideEffect 会在组件创建时运行其代码块,并在每次组件重新组合时运行。...要使 SideEffect 列表数据改变调用,可以考虑将列表数据作为 key 参数传递给 MyList 组件,这样当列表数据改变,MyList 组件将会重新创建,触发 SideEffect 的回调函数

29610

Android-ViewModel和LiveData使用详解

例如:Activity配置发生改变(屏幕旋转),Activity就会重新创建,onCreate()方法也会重新调用。...直到当前Activity系统销毁,Framework会调用ViewModel的onCleared()方法,我们可以onCleared()方法中做一些资源清理操作。...观察者可以每次应用程序数据更改时更新UI,而不是每次发生更改时更新UI。 没有内存泄漏 当观察者被绑定他们对应的LifeCycle以后,当页面销毁他们会自动移除,不会导致内存溢出。...* 定义ViewModel和创建LiveData * ViewModel是以关联生命周期的方式来存储和管理UI相关的数据的类,即使configuration发生改变(比如旋转屏幕),数据仍然可以存在不会销毁...使用(演示 Activity中与Fragment中和FragmentFragment相互通信) Activity中: package io.dcloud.H56580E2E.viewModelLiveData

3.4K30

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

ViewModel 设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据例如屏幕旋转这样的配置更改后依然保留。...ViewModel 设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据例如屏幕旋转这样的配置更改后依然保留。...() 调用的时候调用。...onSaveInstanceState() 配置更改期间和 activity 进入后台调用;在这两种情况下,如果你的数据保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...此外,Loader 可以配置更改期间保留,比如说加载的过程中你旋转了手机屏幕。这听起来很耳熟吧!

91020

【ViewPager2避坑系列】瞬间暴增数个Fragment

由于Log太长,一屏根本截不完,反正就是很多个Fragment经历了onCreate->onDestory的所有过程; 操作前,只有Fragment2创建并显示,理论上旋转屏幕之后,只有Fragment2...销毁并重建,不会调用其他Fragment;现在问题发生在了,旋转之后有一堆Fragment创建并且销毁,最终保留的也只有Fragment2,这肯定是个Bug,虽然发生在一行代码都没有改的官方Demo上;...竖屏,widthMeasureMode一直都是1073741824(MATCH_PARENT),但是横屏状态下,widthMeasureMode0(UNSPECIFIED)和MATCH_PARENT...FrameLayout会测量所有可见View的尺寸,然后算出最大的尺寸maxWidth和maxHeight,自身尺寸的测量调用setMeasuredDimension()方法,每个Dimension的设置调用...,横向滑动要避免layout_width="0dp"和layout_weight="1",纵向滑动要避免layout_height="0dp"和layout_weight="1",代码的解决方案很简单

7.2K30

《Android编程权威指南》之UI fragmentfragment管理器

然后呢,由于有平板的存在,对于平板的屏幕尺寸来说,为了适配它,这两个页面可以显示一屏中。 UI 为了适配手机和平板设备的两种不同的 UI 结构,接下来就要学习新的知识点啦!...: 设备旋转或回收内存,Android系统会销毁MainActivity,而后重建,会调用MainActivity.onCreate(Bundle?)...activity销毁,它的FragmentManager会将fragment队列保存下来。...添加 fragment 供 FragmentManager 管理,onAttach(Context?)、onCreate(Bundle?)和onCreateView(...)函数会被调用。...向处于运行状态的 activity 中添加 fragment ,以下 fragment 生命周期函数会被依次调用:onAttach(Context?)、onCreate(Bundle?)

47920

ViewModel

一.视图和数据模型之间的桥梁ViewModel   页面(Activity/Fragment)功能较为简单的情况下,通常会把UI交互,与数据获取等相关的业务逻辑全部写在页面中。...但是页面功能复杂的情况下,这样做是不合适的,因为它不符合“单一功能原则”。页面应该只负责处理用户和UI控件的交互,并将数据展示屏幕上。与数据相关的业务逻辑应该单独处理和存放。...为了验证这一点,我们ViewModel中创建一个计时器,每隔1s钟,通过接口OnTimeChangeListener通知它的调用者,并通过这个示例来学习一下ViewModel的使用。   ...可以看到,当屏幕发生旋转的时候,计时器仍然继续,这意味着横竖屏下的Activity对应的ViewModel是同一个,它所持有的数据一直存在着。...但同样需要注意的是,ViewModel不支持数据的持久化,当界面彻底销毁,ViewModel及其持有的数据就不存在了,但是onSavaInstanceState()方法没有这个限制,它可以持久化页面的数据

18230
领券