使用 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()的主要内容,如果未能解决你的问题,请参考以下文章

滑动时 ViewPager 更新片段

滑动 ViewPager 时如何清除片段相关状态

我的片段中有 webview,当滑动 webview 时, viewPager 也开始滑动

使用 viewpager 创建多个片段

在 ViewPager 中滑动方向

如何在 viewpager 中显示 2 个片段