2014-10-08 100 views
3

參考裏面一個新的片段:Fragment Documentation爲什麼實例的公共靜態類

我是新來的Java和Android,並通過中文版在線指南去。我有兩個問題:

問題1:爲什麼需要在 public static class中創建一個新的DetailsFragment實例?

問題2:「創建新實例」進一步聲明瞭一個新的DetailsFragment。總體來說 有四個地方使用同一個名字「DetailsFragment」。這很混亂。 請解釋一下嗎?


public static class DetailsFragment extends Fragment { 

    /* Create a new instance of DetailsFragment, initialized 
     to show the text at 'index'. */ 

    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 
} 

回答

3

這就是所謂的static factory method pattern,在這種情況下,您可以輕鬆地創建與所有的填充所需參數的片段的新實例,而不必瞭解內部實現。例如,如果沒有這個,創建片段的正確初始化實例,你可以使用:

DetailsFragment fragment = new DetailsFragment(); 
Bundle args = new Bundle(); 
args.putInt("index", index); 
fragment.setArguments(args); 
// Then use the fragment however you need it 

使用靜態工廠方法,所有的邏輯都內化爲片段本身,你可以簡單的使用方法:

DetailsFragment fragment = DetailsFragment.newInstance(index); 
// Then use the fragment 
1

的片段最好的做法是使用靜態newInstance()方法,因爲Android系統需求(並使用)的空公共構造在許多情況下,以創建您的片段。

例如,如果你顯示一個DetailsFragment然後用戶鎖定他們的設備和回來半小時後,Android將嘗試重新創建應用程序的狀態,當它需要重新實例化DetailsFragment,它將使用空的公共構造函數。

但是,片段支持使用setArguments(Bundle)。因此,您可以使用靜態newInstance()方法代替構造函數來設置重新創建碎片所需的參數。

在這個DetailsFragment的示例中,當Android重新創建片段時,index變量仍然可以通過調用getArguments().getInt("index")訪問片段。如果您在構造函數中創建了index變量,那麼在重新創建碎片時,該信息將會丟失。

相關問題