【问题标题】:OnResume() not called in Fragment using tabLayout and ViewPager使用 tabLayout 和 ViewPager 在 Fragment 中未调用 OnResume()
【发布时间】:2016-02-16 15:09:37
【问题描述】:

我正在使用tabLayout 开发一个应用程序。

我有一个问题:当我尝试重新激活Fragment 时,方法OnResume 未被调用。

这是我的活动:

 private void init() {
    fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Nuovo Ticket", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });


    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);

    tabLayout.setupWithViewPager(viewPager);
}

我使用这样的 FragmentStatePagerAdapter:

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return new LavorazioneFragment();
        case 1:
            return new PendingFragment();
        case 2:
            return new StoriciFragment();
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}

}

当我从TAB3 片段(最后一个)重新激活TAB1 片段时,会调用OnResume 方法。但是,例如,

当我尝试从第二个标签重新激活第一个标签时,从未调用过。

【问题讨论】:

  • 你没有使用setupWithViewPager()有什么原因吗?
  • @Daniel Nugent 没有理由!我该如何使用它?
  • @DanielNugen 我已经按照你的建议更新了我的代码,但没有解决我的问题。

标签: android android-fragments android-viewpager android-tablayout


【解决方案1】:

我已经解决了这个问题。 我使用 setUserVisibleHint(boolean isVisibileToUser) 而不是 onResume()。像这样:

 @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        init();
    } else {

    }
}

谢谢大家!

【讨论】:

  • 作为注释,我认为重要的是要提到在返回或从活动切换时不会调用它。当设备从 SLEEP 或 REST 模式唤醒时,它也不会被调用。仅当用户通过在片段之间滑动或手动按下选项卡在选项卡之间切换时才会调用此方法。所以不要忘记在你的 onResume 和 onPause 方法中包含逻辑。
  • 关于这个的很多冗长的帖子。有几个提到了return POSITION_NONE 方法。我没有尝试过 - 弄乱适配器,我尽量避免。在片段级别应用此解决方案,发现合并起来非常简单。很好 - 谢谢
  • @gnB 其他问题是关于刷新片段,而不是调用onResume
  • @Emanuel 我对这个评论的推理是从纯粹的功能角度来看 - 不是特定于实现的。对于onResume,通常情况下您需要刷新片段。它在后台,对模型进行了一些更新,现在片段又回到了前台。在 ViewPager 设置中onResume 对我不起作用的情况下,每次寻呼机片段回到前台时.. 这个已发布答案中的解决方案确实可以可靠地进行刷新。此外 - 我认为这里的简单性是一种优雅的设计选择。只是我的 0.02 美元
  • 此方法现已弃用。
【解决方案2】:

接受的答案对我不起作用。不过,我找到了解决问题的办法。

只需使用以下构造函数初始化您的 FragmentStatePagerAdapter:

public MyPagerAdapter(FragmentManager fm, int behaviour) {
    super(fm, behaviour);
}

像这样:

MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多