2012-11-13 108 views
3

嗨,我不知道我做的是正確的事情。我在一個活動中有幾個片段(未同時顯示)。當我添加片段時,是否必須檢查前一個實例是否存在?我使用的是兼容包,我的片段CameraFragment是一個單獨的類(在它自己的文件):Android片段實例避免重複

private void addNewFragment(Fragment fragment, String tag) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.frag1, fragment, tag); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

然後:

public void startPicTaking() { 

    addNewFragment(CameraFragment.newInstance(), TAG_PIC_TAKING); 

} 

所以每次用戶點擊一個按鈕,拍攝一張照片我使用這種方法,但我應該驗證片段是否已經存在,並且首先將其刪除,或者執行靜態方法newInstance確保片段不重複?

我已經讀了幾次文檔,但我不明白爲什麼行: ft.addToBackStack(null); 這是幹什麼用的?我知道你可以彈出後退堆棧並保存事務,但是如何使用它以及如何使用?是否有必要或如果我不使用它我可以跳過它?

感謝

回答

2

我有一個活性(在同一時間未示出)的幾個片段。當我添加片段時,是否必須檢查前一個實例是否存在?

不,它只會在它添加下一個實例時創建Fragment的新實例。它不會影響它的前一個實例。

所以每次用戶點擊一個按鈕,拍攝一張照片我用這個方法,但我將首先驗證是否片段已經存在,並刪除它或它的靜態方法的newInstance確保片段不重複?

你可以這樣做,如果你想確保沒有Fragment在堆棧中出現兩次。 (所以當你回擊時,你不會再次獲得相同的活動。)根據你背部堆疊中出現的具體情況,你可能不需要想要刪除更低的東西。 (考慮到用戶希望以前的片段,當他點擊後退按鈕出現。)

我已閱讀文檔幾次,但我不明白爲什麼該行:ft.addToBackStack(NULL);它是爲了什麼?

Fragment對象添加到後退堆棧,那麼每個用戶打回的時候,他們會去上一個項目堆棧。如果您沒有將項目添加到後退堆棧,則用戶在碰到後退按鈕時不會遇到它。

+0

感謝Eric,所以如果我理解正確,如果我希望我的片段在刪除時被銷燬,那麼我省略addToBackStack(null)? – vallllll

+1

沒錯。如果當你調用'replace()'時,當前片段沒有保存在後端堆棧中,它將被銷燬。 – Eric