2014-10-29 104 views
1

根據Android developers website,「每個片斷必須有一個空的構造函數,因此它可以在恢復其活動狀態時實例化」。因此,在新的示例項目中,它們具有以下片段實例:擴展片段的空構造函數

public static class PlaceHolderFragment extends Fragment { 

    public PlaceHolderFragment() {} 

    ... 
} 

對於非靜態片段類,這是否必要(鼓勵?)?實際上,我不太瞭解空構造函數將如何幫助恢復活動狀態。我有許多沒有空構造函數的自定義對話框片段,但是它們沒有問題。如果我沒有爲擴展片段提供一個空的構造函數,會有什麼後果?

回答

0

需要對發生的任何事情打電話給任一片段的靜態方法的空構造:

public static Fragment instantiate (Context context, String fname) 
public static Fragment instantiate (Context context, String fname, Bundle args) 

Android框架使用這些方法來創建你的XML佈局定義的片段。它還將在還原片段的活動狀態時使用它們(例如,在方向更改時)。

如果未定義空構造函數,並且上述方法之一被調用,則會得到java.lang.InstantiationException。

如果你看看Fragment源代碼,你會發現這些方法調用片段類的newInstance()方法。這需要一個公共的空構造函數。

2

建議在片段類中有一個空的構造函數,因爲在某些情況下,如屏幕旋轉,Android系統將調用片段的空構造函數來重新創建片段。

要回答你的問題,即使你沒有提供空的構造函數,只要你的片段中沒有任何參數化構造函數,你的應用程序仍然可以工作。這是因爲當你沒有在類中提供任何構造函數時,java編譯器會自動添加一個空的構造函數。

如果您在類中定義了任何參數化構造函數,編譯器將不會自動添加空構造函數。在這種情況下,如果你知道有人會創建一個沒有參數的類的對象,你必須明確地定義一個空構造函數。這是通用的java編譯器行爲,並非僅針對android。

由於在類中定義了參數化構造函數時,人們忘記添加默認構造函數是一種常見的錯誤。所以android開發人員網站堅持要創建片段中的空構造函數以保證安全。 空的構造函數是否由您生成或提供,只要它存在於片段中並不重要。