使用 ViewPager 滑动时,片段没有调用 OnResume()
Posted
技术标签:
【中文标题】使用 ViewPager 滑动时,片段没有调用 OnResume()【英文标题】:Fragment's are not calling OnResume() when swiping with ViewPager 【发布时间】:2016-12-28 09:53:47 【问题描述】:解释我的问题:
我花了很多时间,但我无法让它工作。我在包含三个片段的主要活动中使用 (Tabhost) 查看寻呼机。我的 ViewPagerAdapter 类扩展 FragmentStatePagerAdapter
。
我面临的问题是,当我滑动 View 时,我的 OnResume()
方法没有被调用。我想在滑动时更新 viewpager 片段的视图。
我的OnResume()
方法只有在我点击ListView
项目并再次返回时才会被调用。但是当我在 ListView 上按 OnLongClick 时,其他片段不会刷新。
注意:我知道以前有人问过这个问题,但这些解决方案都没有帮助我。
注意 2:当我的手机进入睡眠状态,然后在解锁手机第二个片段后调用 onResume()
我的OnResume()
第一个标签中的方法:
@Override
public void onResume()
super.onResume();
adapterLogin.notifyDataSetChanged();
第二个选项卡中我的OnResume()
方法:
@Override
public void onResume()
super.onResume();
adapterLogin.UpdateView(databaseHelper.getAllVoitureFavourite(1,username));
adapterLogin.notifyDataSetInvalidated();
adapterLogin.notifyDataSetChanged();
BaseAdapter
中我的UpdateView()
方法:
public void UpdateView(List<Voiture> items)
this.voitureList = items;
notifyDataSetInvalidated();
notifyDataSetChanged();
我的应用程序的屏幕截图,以便更多地了解 mu 问题:
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:使用 setUserVisibleHint(boolean isVisibleToUser)。
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
// Do your stuff here
【讨论】:
在片段中覆盖这个方法 覆盖 'androidx.fragment.app.Fragment' 中已弃用的方法【参考方案2】:您描述的行为是 ViewPager 的工作原理,没有任何问题。
此外,如果您查看 ViewPager 类的源代码,您会注意到 offscreenPageLimit 的最小值为 1。将其设置为 0 根本没有任何作用,因为它会回退到默认值 1。
您可以做的是添加一个 TabHost.OnTabChangeListener 以便在每次滑动时调用适当的方法。
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener()
@Override
public void onTabChanged(String tabId)
switch (mTabHost.getCurrentTab())
case 0:
//fragment 1 update()
break;
case 1:
//fragment 2 update()
break;
case 2:
//fragment 3 update()
break;
);
【讨论】:
【参考方案3】:如果您的 ViewPager 只有 2 个页面,则在滑动期间两个片段都不会暂停,并且永远不会调用 onResume()。
我相信默认情况下它总是保留相邻页面,这意味着它的页面限制为 1。
您可以尝试将其保留的页数设置为 0。
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(0);
【讨论】:
检查当您滑动到第 3 页并返回时您的第一页是否刷新并告诉我。确保你记录你的 onResume() 函数,因为如果你的数据没有改变,那么你就不会注意到它在刷新。此外,请注意第二个选项卡的 onResume() 方法。看来您两次调用 notifyDataSetInvalidated() 是不必要的。以上是关于使用 ViewPager 滑动时,片段没有调用 OnResume()的主要内容,如果未能解决你的问题,请参考以下文章