【问题标题】:onResume() of previous fragment getting called上一个片段的 onResume() 被调用
【发布时间】:2017-03-22 11:06:48
【问题描述】:

在我的应用程序中有一个Activity 和三个fragments 说A、B、C。我将它们加在一起。

我没有在backstack 中加载片段A,但是在单击列表视图项时,我将另外两个加载到后台堆栈中。现在我的问题和有趣的部分是,虽然onBackPressed() 没有任何片段的回调方法(onResume(),onStart())被调用,但是如果我锁定手机并恢复我的活动,并且我在片段 C 上,所有片段的 onResume以前的片段 A 和 B 被调用。在onResume() 我调用了一个 api,所有检查都失败了

if(getFragmentManager()!=null && activity!=null) {
      DashboardFragment currentFragment = (DashboardFragment) getFragmentManager().findFragmentById(R.id.container);
      if(currentFragment.isVisible() && isAdded() && isVisible() && getUserVisibleHint()) {
       //callApi;
       }
}

没有像 isvisible() 这样的方法返回正确的值和像

这样的方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
}

没有被调用。那么如何确保仅在片段可见时才调用 api。

【问题讨论】:

  • 在将这些片段添加到 Activity 的视图中时,您使用的是 add 还是 replace
  • @mwieczorek 我正在使用添加
  • 添加或替换没有任何区别
  • 你的片段 c onResume() 是否被调用?
  • @jiteshmohite 是的,是的,但我想确保当我在 c 时不会调用 A 的 onResume

标签: android android-fragments onresume


【解决方案1】:

仅在片段对用户可见后,我用于从 API 加载数据的代码是:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser && isResumed()) {
        // API call
    }
}

不太清楚你为什么要从其他人那里调用你的DashboardFragment,如果他们没有嵌套的话。

当然,您可以将 API 逻辑添加到 onResume() 方法。除非您的片段位于 ViewPager 中,否则当调用 onResume() 时,它们将对用户可见。

【讨论】:

  • 我不是在调用 DashboardFragment , DashboardFragment 是一个片段,但是当手机激活时,即使我在片段 C 上 DashBoardFragment 的 onResume 也会被调用。
  • 除非您在 B 或 C 处于活动状态时出于某种原因需要 A 在内存中,否则您应该使用 replace。这将解决您不希望调用 A 中的任何内容的问题。
  • 加载片段时也不会调用您提到的方法
  • getUserVisibleHint()onCreate() 之前被调用,如果我没记错的话。
  • 上面应该是setUserVisibleHint(),在onCreate之前调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多