2016-12-15 195 views
0

在機器人編程,Android中的'new Fragment()'和'Fragment.getInstance()'有什麼區別?

當我們片段添加到特定的佈局,

我們可以使用folloing碼

Fragment fragment = new SampleFragment(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.content_layout, fragment); 
fragmentTransaction.commit(); 

Fragment fragment = SampleFragment.getInstance(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.content_layout, fragment); 
fragmentTransaction.commit(); 

我不明白是什麼區別片段對象定義句子。 從某些來源,當使用'Fragment.getInstance()'類似單例模​​式時,使用'getInstance(Bundle data)'方法參數將包數據傳遞給片段。

你能告訴我有什麼區別嗎?

+0

[此鏈接可能會幫助你,請訪問這裏一次](http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment) – xbadal

+0

http:// www .androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html此鏈接必須幫助您 – Athul

回答

1

首先要注意的是,如果系統破壞了你的片段並且必須重新創建它,它將會使用no-args調用構造器。這意味着你必須將你的參數保存在某個地方以備後用(你不能用args創建一個構造器)。

現在,讓我們回到你的問題。目前,這兩個代碼塊幾乎完全相同,但僅限於您提供的示例。如果你應該將一些參數傳遞給你的片段,那麼情況會有所不同。 getInstance應該將所需的參數添加到片段中,以確保它們將在未來時刻可用。個人而言,我使用getInstance/newInstance(您可能會發現它的變體,現在,在Android Studio中使用newInstance)創建模板片段,並在該片段中傳遞我需要的參數。例如,如果我在該片段中需要兩個字符串,我會將它們傳遞給getInstance方法 ,並將它們保存在片段參數中,以確保片段重新創建時它們將可用。

public static MyFragment getInstance(String param1, String param2) { 
    MyFragment fragment = new MyFragment(); 
    Bundle args = new Bundle(); 
    args.putString(KEY_ONE, param1); 
    args.putString(KET_TWO, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

當然,這種方法可以傳遞一個Bundle,但我認爲是這樣一點點清晰,指定每個參數片段將使用。

話雖這麼說,如果你想創建你應該使用這樣的上述塊的等效:

MyFragment fragment = new MyFragment(); 
Bundle args = new Bundle(); 
// set your arguments here 
fragment.setArguments(args); 
// and from here use your code as you did 

最後,使用getInstance用來停止代碼重複(注意,如果您應該創建片段10次,你應該複製上面的代碼10次),如果你正確地創建片段(第二塊代碼),你不必使用getInstance方法,但建議。

4

片段實例化的getInstance()是一個熟悉的設計模式,它封裝了片段及其參數的創建。這基本上意味着Fragment負責創建自己的實例,並且應該比僅調用新的Fragment()更清潔和更安全,因爲您可以傳遞其他數據/捆綁包並「強制」用戶使用此方法。請注意,您仍然在getInstance()方法中調用新的Fragment(),它不會替換它。

public static SomeFragment newInstance(int a, boolean b) { 
SomeFragment someFragment = new SomeFragment(); 

Bundle args = new Bundle(); 
args.putInt("a", a); 
args.putBoolean("b",b); 
..... 
someFragment.setArguments(args); 

return someFragment; 
} 

這樣你將只有一個地方你會創建參數包,而不是每次你想實例化片段。

相關問題