【发布时间】:2018-04-13 17:06:56
【问题描述】:
我的activity 中有 10 个标签。一旦我打开活动,就会显示第一个片段,但会调用下一个片段中存在的方法(AsyncTask)。 如果我转到下一个选项卡说第三个选项卡,那么第四个fragment 中的方法会被调用,依此类推。
我不明白这种行为。请帮忙!
【问题讨论】:
标签: android android-fragments android-tabs fragmentpageradapter
我的activity 中有 10 个标签。一旦我打开活动,就会显示第一个片段,但会调用下一个片段中存在的方法(AsyncTask)。 如果我转到下一个选项卡说第三个选项卡,那么第四个fragment 中的方法会被调用,依此类推。
我不明白这种行为。请帮忙!
【问题讨论】:
标签: android android-fragments android-tabs fragmentpageradapter
您必须知道viewPager 如何在不同位置填充fragment
当您从位置 0 开始时,会创建位置 0 上的 fragment 和位置 1 之一。
然后,当您滑动到位置 1 时,会在位置 2 上创建 fragment,因此您现在在不同位置上创建了三个 fragments(0,1,2..假设您只有 3 页在viewPager)。
我们滑动到位置 2,最后一个位置,第一个位置 (0) 上的 fragment 被销毁,所以我们现在在位置 2 和 3 上有 fragments。
这就是Fragment LifeCycle 的工作原理
你可以设置mViewPager.setOffscreenPageLimit(2); // 2 is just an example来限制它
如果您希望在Fragment 对用户可见时执行某些代码,请在setUserVisibleHint 方法中添加部分代码
【讨论】:
默认为 viewpager.setOffscreenPageLimit(1) ,这意味着 View pager 将默认加载至少 1 个在当前选项卡的右侧和一个在左侧选项卡上。
这样做,主要是因为当您滑动查看器时,两个选项卡的某些区域都可见。对于那些平滑过渡,需要预加载。
你不能设置它viewpager.setOffscreenPageLimit(0).
唯一的出路就是用这个方法setUserVisibleHint
将此添加到您的片段中
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load data here
}else{
// fragment is no longer visible
}
}
仅当该特定选项卡对用户可见时才会调用,因此只有这样您才能调用所有加载函数。
【讨论】:
把你的 AsyncTask 方法放在里面。
您可以像这样覆盖 setMenuVisibility:
@Override
public void setMenuVisibility(final boolean visible) {
if (visible) {
//execute AsyncTask method
}
super.setMenuVisibility(visible);
}
编码愉快!!
【讨论】:
Override below method and move your code for Aync task into this instead of onStart() or onCreateView.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Load your data here or do network operations here
isFragmentLoaded = true;
}
}
【讨论】: