2016-05-25 84 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的交易。