0

MapFragmentSupportMapFragment的文檔中,他們通過調用newInstance()而不是使用new SupportMapFragment()來創建新片段。擴展SupportMapFragment - 如何實例化新的片段?

我的應用項目擴展SupportMapFragment,我試圖打電話給MyMapFragment.newInstance()我的片段級,造成顯示出來的地圖如預期,但沒有我的重載方法如onCreateView()onActivityCreated()都被調用。花了我一會兒,然後我試圖用new MyMapFragment()來實例化我的片段 - 而且,我的重寫方法開始被調用!

我沒有在我的類中重寫newInstance(),並在事後很明顯,newInstance()返回SupportMapFragment一個實例,而不是我的擴展類的一個實例(廢話!)。

但我的問題是 - 爲什麼有一個newInstance()方法及爲何文檔中使用它,當它似乎很好的工作使用new SupportMapFragment()?使用其中一種或另一種的區別是什麼?我一直無法找到SupportMapFragment的源代碼,所以...

+0

見:http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment – pedromss

回答

1

在這種情況下,我相信newInstance方法只是一個靜態工廠方法的空構造函數,所以沒有效果(儘管沒有源代碼可我們不能確切知道),即它可能是這樣的:

public static SupportMapFragment newInstance() { 
    return new SupportMapFragment(); 
} 

那麼,爲什麼存在?

  • 對於與其他newInstance(GoogleMap)方法最有可能
  • 理論上該方法可以返回一個子類的SupportMapFragment,也許是一個
  • 如果任何參數需要的設備或平臺優化設置的一致性(也許現在或將來)

因爲最後一點,它通常是一個很好的做法創建片段時,總是使用靜態的工廠,在未來它可能被修改爲:

public static SupportMapFragment newInstance() { 
    SupportMapFragment fragment = new SupportMapFragment(); 
    Bundle args = new Bundle(); 
    args.putBoolean("secretOptionNotEnabledWithNormalConstructor", true); 
    fragment.setArguments(args); 
    return fragment; 
} 
+0

而延伸的,當一個應該利用超類的newInstance() ?如果在SupportMapFragment.newInstance()中確實存在特殊情況,那麼最好是將它用作我的子類的「構造函數」嗎?我將如何做到這一點? – BadCash

+0

由於無法重寫靜態方法(靜態方法真的像全局函數,類名僅提供一些範圍),所以在繼承子類時不能使用newInstance() –

+0

好吧,有一種感覺就是這種情況。 (但現在是凌晨1點,所以我現在不能真正包裹我的頭:)謝謝。 – BadCash