OnCreateView多次调用/使用ActionBar和Fragments

时间:2012-08-30 16:45:57

标签: 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);

这是我的听众代码:

    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) {          

        }

    }

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

2 个答案:

答案 0 :(得分:47)

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

此问题的一个解决方案是在切换时使用FragmentTransaction.detach(Fragment)FragmentTransaction.attach(Fragment)。这将导致重新创建Fragment视图(将调用onDestroyView()& onCreateView()),但实例状态包将被保存并在调用之间返回给您,因此可以维护视图状态。这是FragmentPagerAdapter尝试在片段之间切换时采用的方法。

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

您可以查看source for FragmentPagerAdaptersource for FragmentStatePagerAdapter的实施提示。

答案 1 :(得分:7)

show / hide选项,因此不需要重新制作/重新创建片段,并且不会重新调用onCreate()onCreateView()。< / p>