ViewPager和Fragment生命周期与Activity

时间:2016-02-28 00:21:44

标签: android android-fragments android-viewpager android-lifecycle

我正在使用Activity,其中ViewPager包含2个片段,寻呼机处理程序是FragmentPagerAdapter的一些实现。

据我所知,寻呼机适配器处理其中碎片的生命周期。

  • 我发现我的Activity onResume()方法已被调用,但片段onStart()方法甚至没有启动。 我怎么能解决这个问题呢?它破坏了活动与片段之间的整个生命周期交互点......

  • 由于寻呼机适配器处理Fragment的生命周期,这是否意味着我不再依赖与Activity的互动?我的意思是,如果我希望ActivityonResume()中执行某些操作,但在Fragment onStart()被调用之后,我就是不能这样做...

编辑:

要明确: 谷歌说活动和片段的生命周期在一起,一旦被调用,另一个也被调用,例如

  1. Activiy - > onCreate(),然后Fragment - > onCreate()

  2. Activiy - > onResume(),然后Fragment - > onResume()

  3. BUT!在我的情况下,我得到: Activity - > onCreate() - > onStart() - > onResume() - > onPostResume()

    然后: Fragment - > onAttach() - > onCreateView() - > ...... - > onResume()

    并且要清楚,我使用的是寻呼机适配器(不是“状态”寻呼机),我的应用程序中有一个抽象的基础活动,所有活动都应该扩展。

    public abstract class AbsLoginAppCompatActivity extends AppCompatActivity {
    .............
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "*******************onCreate");
        //do some general stuff like check for updates on server
    }
    

    在我的扩展活动中:

    public class A extends AbsLoginAppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG, "*******************onCreate");
        setContentView(R.layout.activity_a);
        //also set pager + adapter + give it getSupportFragmentManager()
    }
    

    我正在使用:

    android.support.v4.view.ViewPager

    android.support.v4.app.FragmentPagerAdapter

    android.support.v4.app.Fragment

    android.support.v7.app.AppCompatActivity (适用于abs活动)

1 个答案:

答案 0 :(得分:1)

Fragment[State]PagerAdapter使用活动FragmentManager - 或者在父片段中嵌套ViewPager的情况下 - 该片段的子FragmentManager来管理片段,就像普通的碎片一样。实际上,这些适配器实现的唯一功能就是它们会为您隐藏讨厌的FragmentTransaction内容。

我从来没有遇到过在我的片段中没有为我调用过特定生命周期回调的问题,所以我不能对此说些什么。然而,有一件事是重要的,要理解并且许多人出错只是在新创建片段时调用适配器的getItem()方法;如果它从保存的状态恢复,则不会再次调用此方法,并且人们倾向于在那里做所有奇特的事情来初始化他们刚刚创建的"片段,虽然他们应该真正查看instantiateItem(),它会返回您通过getItem()提供适配器的实例,或者返回为您自动重新创建的片段的引用。

有关分页器中片段的另一个好处是方法setUserVisibleHint(boolean)。由于片段通常是一次性重新创建和恢复(非状态适配器)或按需(状态适配器),因此知道一个实例何时对用户实际可见通常很重要。这可以通过在自定义片段中覆盖上述方法来实现。