【问题标题】:Fragment lifecycle Android片段生命周期 Android
【发布时间】:2015-07-13 18:37:22
【问题描述】:

如下所示。最好的方法是向 viewpager 添加一个监听器,以了解每个片段何时被选中。

这样,Activity 可以通过例如一个接口触发片段刷新监听器。

【问题讨论】:

  • 它的 viewPager 好,研究 viewpager 的工作原理,有些事情会为你揭开,但如果它们在启动时加载,那么它们就在内存中并且切换不会调用任何生命周期
  • 谢谢,我会好好研究一下,有什么办法可以再次强制 onCreate 吗?或者这不是一个好习惯?
  • 没有 android 处理你的 Fragments 的初始化,所以你不能直接 onCreate() 来获得你想要的效果,虽然我不会这样做,

标签: android android-fragments fragment android-lifecycle


【解决方案1】:

检查这个post 两个答案并评论它是你需要的。还要想到一个更清晰的解决方案,当您翻转它们时要调用的代码将它们放在 Fragment 类中的 public method 中,然后在 ViewPager 中的 onPageSelected 中,通过位置访问特定的 Fragment (或者无论如何你想像ViewPager.getItem(pos))那样做它会返回一个片段,你可以检查那个片段是否是你喜欢的片段类的实例并将它转换为它并调用你的代码

//suppose i have my fragment via myViewp.getItem(2)
if(fragmentObject instanceof MyFragmentClass){
    //do work
 }
 //put else and check for others

【讨论】:

    【解决方案2】:

    片段没有立即回调;从框架来看,Fragment 的所有三个生命周期都是相同的:它们附加到活动、创建、创建视图和恢复。这些回调都与它们在 ViewPager 中的显示方式无关,而且是有充分理由的。

    您对 ViewPager 中的回调感兴趣。为此,您可以注册ViewPager.OnPageChangeListener

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // If you would like to have more granular control than onPageSelected(),
        // you may inspect when the user "begins to scroll" to the next page
    }
    
    @Override
    public void onPageSelected(int position) {
        Fragment fragment = mAdapter.getItem(position);
        if (fragment instanceof OnMyFragmentSelectedListener) {
            ((OnMyFragmentSelectedListener) fragment).onMyFragmentSelected();
        }
    }
    
    @Override
    public void onPageScrollStateChanged(int state) {
    }
    

    在上面的 sn-p 中,我引入了一个名为 OnMyFragmentSelectedListener 的接口。如果你的 Fragment 实现了它,并实现了 onMyFragmentSelected() 方法,ViewPager 会在它的页面被选中时通知你的 Fragment。

    您可以使用 OnPageChangeListener 做一些有趣的事情,例如在片段之间设置动画,如 JazzyViewPager。在您的情况下,您可以改为在调用侦听器时开始加载其他数据。

    【讨论】:

      【解决方案3】:

      你需要通过 setArguments 传递你想要的数据。

       ChildFragment fragment = new ChildFragment();
       Bundle bundle = new Bundle();
       bundle.putInt("PARAMETER", param);
       fragment .setArguments(bundle);
      

      【讨论】:

      • 虽然这是真的,但我认为这个答案不能解决问题。
      【解决方案4】:

      检查此链接。它使用新的 android 架构和 dagger 2 在两个片段之间共享数据。 https://github.com/MohitGoel9456/Android-Live-Data-Dagger2 无需使用参数和捆绑共享数据,因为它是旧方式。

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        相关资源
        最近更新 更多