OnCreateView多次调用/与动作条和片段工作(OnCreateView called mul

2019-06-17 23:04发布

我打开我的应用程序的一部分,从活动的片段,这样我可以用整齐的动作条的标签。

但是,在完成转型后,我遇到了一个问题:每当我切换到另一个选项卡,该片段被创建一遍。 双方的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) {          

        }

    }

可能有人请点我在正确的方向?

Answer 1:

当你调用FragmentTransaction.replace(...) ,Android将有效地执行序列FragmentTransaction.remove(...) (对于目前加入到容器内的所有片段)和FragmentTransaction.add(...) (为您提供分段)。 删除从一个片段FragmentManager将导致要销毁的碎片,它的状态将不再管理。 最值得注意的是,当您重新添加该片段所有的意见都会被重置。 注:因为你是重用相同片段的实例,该片段仍然会保持价值的任何实例变量。

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

或者,你可以让片段被摧毁,但独立维护自己保存的状态他们。 这将使用较少的内存,在较慢的切换时间为代价的。 值得注意的方法是FragmentManager.saveFragmentInstanceState(片段)和FragmentManager.setInitialSavedState(Fragment.SavedState) ,在同一起选择添加/删除。 这是采取的办法FragmentStatePagerAdapter 。

你可以看看源FragmentPagerAdapter和对FragmentStatePagerAdapter源实施的提示。



Answer 2:

还有就是显示 / 隐藏只是这样的碎片不会需要重新绘制/重建和选项onCreate()onCreateView()将不会被再次调用。



文章来源: OnCreateView called multiple times / Working with ActionBar and Fragments