OnCreateView多次调用/使用ActionBar和Fragments

Sor*_*ban 41 android android-fragments android-activity android-actionbar

我将我的应用程序的一部分从活动切换到碎片,以便我可以使用整洁的ActionBar选项卡.

但是,在完成转换后,我遇到了一个问题:每当我切换到另一个选项卡时,Fragment都会重新创建.每次进入选项卡时都会调用onCreate和onCreateView.

我有4个选项卡,每个选项卡都打开这些片段之一:

Fragment ShopFragment = new WebActivity();
Fragment SearchFragment = new SearchActivity(context);
Fragment StoreFragment = new StoreLocatorActivity(context, this);
Fragment BlogsFragment = new BlogsActivity(context, this);
Run Code Online (Sandbox Code Playgroud)

这是我的监听器代码:

    class MyTabsListener implements ActionBar.TabListener {
        public Fragment fragment;

        public MyTabsListener(Fragment fragment) {
            this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            ft.hide(fragment);
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.fragment_container, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {          

        }

    }
Run Code Online (Sandbox Code Playgroud)

有人可以指点我正确的方向吗?

ant*_*nyt 48

当您调用FragmentTransaction.replace(...)时,Android将有效地执行一系列FragmentTransaction.remove(...)(对于当前添加到该容器的所有片段)和FragmentTransaction.add(...)(对于您提供的)分段).从遗骸中删除片段FragmentManager会导致片段被破坏,其状态将不再被管理.最值得注意的是,当您重新添加片段时,所有视图都将被重置.注意:由于您正在重用相同的Fragment实例,因此Fragment仍将保留任何实例变量的值.

解决此问题的一种方法是在切换时使用FragmentTransaction.detach(Fragment)FragmentTransaction.attach(Fragment).这将导致重新创建的片段意见(onDestroyView()&onCreateView()将被调用),但实例状态包将被保存和调用,因此可以保持视图状态之间还给你.这是FragmentPagerAdapter尝试在Fragments之间切换时采用的方法.

或者,您可以允许销毁碎片​​,但可以独立地保留碎片的保存状态.这将使用更少的内存,代价是更慢的切换时间.注意的方法是FragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState),与添加/删除相结合.这是FragmentStatePagerAdapter采用的方法.

您可以查看FragmentPagerAdapter代码和FragmentStatePagerAdapter源代码以获取实现提示.


Ali*_*aka 7

show/hide选项,因此片段不需要重新绘制/重新创建,onCreate()并且onCreateView()不会重新调用.