【问题标题】:Is it OK to keep reference to a fragment?保留对片段的引用可以吗?
【发布时间】:2013-01-01 01:47:36
【问题描述】:

我将 FragmentActivity 的导航模式(ActionBar)设置为ActionBar.NAVIGATION_MODE_TABS

标签允许用户在两​​个片段之间切换,一个 listFragment 和一个 mapFragment。mapFragment 包含一个谷歌地图。代码控制两个片段之间的切换。

@Override
public void onTabSelected(ActionBar.Tab tab,
    FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, show the tab contents in the
    // container view.

    if(tab==tab_buyer_browse){
        if(mListFragment==null){
            mListFragment = new ItemListFragment(this,new ItemArrayAdapter(this));
        }
        Bundle args = new Bundle();
        args.putInt(ItemListFragment.ARG_SECTION_NUMBER,
            tab.getPosition() + 1);
        mListFragment.setArguments(args);
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, mListFragment).commit();
    }
    else if (tab==tab_buyer_location){
        if(mapFragment==null){
        //every time,on destroy called anyway, and exception raise. it looks like there is no point maintain a reference to mapFragment ?
            mapFragment = new ItemMapFragment(this);
        }
        getSupportFragmentManager().beginTransaction()
        .replace(R.id.container, mapFragment).commit();
    }

I 维护对两个片段的引用。我认为通过这种方式,我可以避免在每次用户切换标签时创建新片段并重用旧片段。 ListFragment 没有问题,但是如果我切换到 mapFragment TWICE,则会引发异常,说片段已被破坏。

每次用户切换选项卡时,我都会创建新的 mapFragment,并且当我切换时我会体验到 UI 很慢。

所以我的问题是,在父 FragmentActivity 中维护片段的引用是一种好习惯吗?

如果没有,我有什么办法可以控制片段的生命周期,或者至少尽可能地重用它们以避免 UI 缓慢?

【问题讨论】:

  • 应该没问题。你没有“泄漏”任何东西(严格来说),因为如果父母被摧毁,你的孩子也被标记为垃圾。如果您不介意额外的内存使用,并且您可以清楚地看到它为您的应用程序增加了性能优势,那么您应该选择它。请记住,即使是 Google 也会这样做(例如,缓存下一页和上一页的 ViewPager)并且他们通过提前创建它并保留对它的引用来做到这一点。

标签: android android-fragments android-fragmentactivity


【解决方案1】:

您可以使用FragmentPageAdapter 和 ViewPager 来获得选项卡式片段以及支持向左/向右滑动。它会为你处理碎片。

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多