2016-05-25 86 views
0

在许多网站中,我发现片段必须始终嵌入到活动中,并且片段的生命周期直接受到宿主活动生命周期的影响 - 活动暂停时,其中的所有片段以及何时活动被破坏,所有的碎片也是如此。活动中的片段生命周期

但是,它也写在那里,我们可以在不同的活动中重用片段 - 但从上面看,如果我们移动到另一个活动,片段将被销毁。我错过了什么,或者,有人能给我一个在不同活动中重复使用相同片段的例子吗?

回答

2

我想你感到困惑与Fragment实施和Fragment实例的概念。您可以在不同的Activity中使用相同的Fragment实现,但对于每个Activity,您需要新的Fragment实例。该实例的生命周期将直接受到主机Activity生命周期的影响。

有一个Fragment,姑且称之为FragmentA,和一对夫妇Activity,姑且称之为ActivityAActivityB,你有3类:

public FragmentA extends Fragment { 
    // All the FragmentA implementation 
} 

public ActivityA extends Activity { 
    // All the ActivityA implementation 
} 

public ActivityB extends Activity { 
    // All the ActivityB implementation 
} 

在这种情况下,你可以使用的FragmentA展位落实ActivityAActivityB,但是对于每种情况,您都需要创建FragmentA的新实例。

public ActivityA extends Activity { 

    loadFragmentA() { 
     FragmentA instanceA = new FragmentA(); 
     getSupportFragmentManager() 
        .beginTransaction() 
        .add(R.id.fragment_container, instanceA) 
        .commit(); 
    } 
} 

public ActivityB extends Activity { 
    loadFragmentA() { 
     FragmentA instanceB = new FragmentA(); 
     getSupportFragmentManager() 
        .beginTransaction() 
        .add(R.id.fragment_container, instanceB) 
        .commit(); 
    } 
} 

这样,instanceA将涉及到ActivityAinstanceB生命周期会涉及到ActivityB生命周期,但展位是FragmentA实例。

0

重用意味着一定FragmentFragmentA)是不依赖于某个ActivityActivityA),但可以通过不同的ActivitiesActivityBActivityC)一起使用。这并不意味着您可以在Activities之间传递Fragment实例。

+0

ActivityB如何使用FragmentA? – user2637293

+0

在活动b中,您将有第二个片段实例不相同。 – Alok

0

你明白了一点。通过重用,意味着我们可以在多个地方使用一个片段(定义),而不是片段对象本身。这并不意味着您可以在活动之间传递片段实例。对于新的活动,有一个新的SupportFragmentManager/Manager。所以,你必须创建一个相同片段的新实例。

片段因此允许您只保留一块不同屏幕的代码。

0

这里的关键是onAttach(Activity)方法的片段,一旦片段与父活动相关联,就会调用片段。

您为任何需要使用片段并将其用于片段事务的活动创建片段类的实例。

DetailsFragment details = DetailsFragment.newInstance(index); 

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
                
ft.replace(R.id.details, details); 
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 

ft.commit(); 
0

如果你想重用一个片段,你应该把这个活动转换成一个片段。

您只能重用您想要执行事务(活动或片段)的FragmentManager的现有片段的片段。

看到这个职位从FragmentManager: https://developer.android.com/reference/android/app/FragmentManager.html 的片段在堆栈中允许的,如果你调用方法addToBackStack的交易。