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

onViewCreated调用了两次

onViewCreated是Android中Fragment生命周期的一个回调方法,用于在Fragment的视图层次结构被创建完毕后进行初始化操作。它在Fragment的onCreateView方法执行完毕后被调用。

onViewCreated方法被调用两次的情况可能是由于以下原因之一:

  1. Fragment被重新创建:当Fragment所在的Activity发生配置变化(如屏幕旋转)或者由于其他原因导致Fragment需要重新创建时,onViewCreated方法会被再次调用。这是因为Fragment的视图层次结构需要重新创建。
  2. Fragment嵌套使用:如果在一个Fragment中嵌套使用了另一个Fragment,并且在父Fragment的onViewCreated方法中调用了子Fragment的实例化和添加操作,那么子Fragment的onViewCreated方法也会被调用。这样就会导致onViewCreated方法被调用两次。

在处理这种情况时,我们可以通过以下方式进行优化:

  1. 使用savedInstanceState参数:在onViewCreated方法中,可以通过savedInstanceState参数判断Fragment是否是重新创建的。如果savedInstanceState不为null,说明Fragment是重新创建的,可以根据需要进行相应的处理。
  2. 使用Fragment的isAdded方法:在父Fragment中调用子Fragment的实例化和添加操作之前,可以先通过isAdded方法判断子Fragment是否已经被添加到父Fragment中。如果已经添加,则不再重复添加,避免子Fragment的onViewCreated方法被调用两次。

总结起来,onViewCreated方法被调用两次可能是由于Fragment的重新创建或者Fragment嵌套使用所导致的。在处理这种情况时,可以使用savedInstanceState参数和isAdded方法进行优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android Jetpack架构组件(四)之LiveData

    定义一个具有onChanged()方法的Observer对象,当LiveData持有数据发生变化时回该方法。...从上述步骤可以看出,LiveData使用了观察者模式,观察者通常是UI控制器,如Activity或Fragment,而被观察者则是LiveData包谷的数据对象, 当LiveData对象持有数据发生变化...onActivite():当有活跃状态的订阅者订阅LiveData时会回该方法,意味着需要在这里监听数据的变化。...setValue():注意到value=price这里是调用了setValue(price)方法,通过该方法更新LiveData的值,进而通知处于活跃状态的订阅者。...如果判断条件都满足就继续调用Observer的onChanged方法,这个方法正是使用LiveData的observe方法的回

    3.1K00

    Jetpack—LiveData组件的缺陷以及应对策略

    二、Observer到底可以接收多少次回 2.1 为什么最多收到2个通知 这是一个典型的案例,在调试消息总线的场景时,我们通常会在消息的接收者那里打印一些log日志方便我们定位问题,然而日志的打印有时候也会给我们的问题定位带来一定的迷惑性...2021-11-21 15:20:07.662 27500-27500/com.smart.myapplication V/ttt: s:3 奇怪,为什么我明明注册了10个观察者,但是只收到了2个回通知...final void onChanged(Object obj) { Log.v("ttt", "s:" + ((String) obj)); } } 已经很清晰的看出来,这里因为使用了...{ model.getCurrentName().observe(this, s -> Log.v("ttt", "s:" + s + outer)); } } 注意看,我们这种写法虽然也是用了...Livedata的存在就是为了照顾Java的使用者,短期内会继续维护(含义是什么大家自己品品),作为Livedata的替代品Flow会在今后渐渐成为主流(毕竟现在Kotlin渐渐成为主流),那如果使用了

    1.2K20

    WindowsInsets 和 Fragment 过渡动画

    问题 这两个 fragment 为了在系统栏下面进行绘制都大量使用了 WindowInsets。...Fragment A 使用了 CoordinatorLayout 和 AppBarLayout,而 Fragment B 使用自定义 WindowInsets 来处理(通过一个 OnApplyWindowInsetsListener...因为我们对 Fragment A 使用了一个退出的过渡动画,所以 View A 还留在原来的位置,过渡动画在上面运行。 View B 被添加到内容视图里面,并且被立即设置成不可见。...因为我们对 Fragment A 使用了一个退出的过渡动画,所以 View A 还留在原来的位置,过渡动画在上面运行。 View B 被添加到内容视图里面,并且被立即设置成不可见。...只需要通过 requestApplyInsets() 就能很容易做到: override fun onViewCreated(view: View, icicle: Bundle) { super.onViewCreated

    1K30

    Android面试题总结【完整详细版本”一”】(含答案)

    使用了singlestance的启动模式的activity会单独的开启一个共享栈,这个栈中只存在当前的activity实例对象。 4、Activity在有Dialog时按Home键的生命周期?...6、 前台切换到后台,然后再回到前台,Activity生命周期回方法。弹出Dialog,生命值周期回方法? 首先定义两个Activity,分别为A和B。...---- 方法二: 采取接口回的方式进行数据传递。...ContentProvider: * 四大组件的内容提供者,主要用于对外提供数据 * 实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据...singleTop:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回 onNewIntent(intent) 方法。

    88820

    Android EventBus实战 没听过你就out了

    b、在目录的Fragment中提供一个接口,然后详细信息面板去注册这个接口,当发生点击时,去回这个接口,让详细信息面板发生改变。...(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 开启线程加载列表...EventBus.getDefault().post(new ItemListEvent(Item.ITEMS));发布了一个事件; onListItemClick则是ListView的点击事件,我们调用了...现在应该明白了,整个运行的流程了;那么没有接口却能发生回应该也能解释了。...纵观整个代码,木有handler、木有AsynTask,木有接口回;but,我们像魔术般的实现了我们的需求;来告诉我,什么是耦合,没见到~~~ 3、EventBus的ThreadMode EventBus

    1K20

    Android 基础:Fragment,看这篇就够了 (上)

    ,该方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加...newInstance("hello world"), "f1") //.addToBackStack("fname") .commit(); } 这里需要注意几点: 因为我们使用了...因此避免出现该异常的方案有: 不要把Fragment事务放在异步线程的回中,比如不要把Fragment事务放在AsyncTask的onPostExecute(),因此onPostExecute()可能会在...onStart] BEGIN Fragment2: [onStart] END Fragment2: [onResume] BEGIN Fragment2: [onResume] END 可以看到,F1最后调用了...} } mPendingActions就是前面说的待执行队列,mHost.getHandler()就是主线程的Handler,因此Runnable是在主线程执行的,mExecCommit的内部就是调用了

    6K40
    领券