我還沒有找到一種簡單的方法來獲取當前活動中的所有活動(可見,當前處於恢復狀態)碎片。沒有自定義簿記在我的活動中嗎?看來FragmentManager不支持這個功能。有沒有一種方法可以獲取活動中所有當前活動片段的引用?
回答
看起來API目前錯過了像「getFragments」這樣的方法。
但是,使用Activity類的onAttachFragment事件應該很容易做到你想要的。我會做這樣的事情:
List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>();
@Override
public void onAttachFragment (Fragment fragment) {
fragList.add(new WeakReference(fragment));
}
public List<Fragment> getActiveFragments() {
ArrayList<Fragment> ret = new ArrayList<Fragment>();
for(WeakReference<Fragment> ref : fragList) {
Fragment f = ref.get();
if(f != null) {
if(f.isVisible()) {
ret.add(f);
}
}
}
return ret;
}
如果沒有從(在本例中isActive())的對象讀取狀態準備好方法,我會覆蓋的onResume和的onPause設置標誌(可能只是一個布爾字段)。
這已經是一些自己的簿記了,但在我看來,考慮到你想實現的具體目標(狀態依賴列表),它仍然非常有限。
嗯,如果沒有對添加到onAttachFragment列表中的實際片段的引用,那麼WeakReference
這對我的目的非常有用。 PS我有行:if(f!= null && f.isVisible()){ \t \t \t \t ret.add(f); \t \t \t} – 2011-08-12 02:13:11
不,ref本身不會變爲null,如果活動被垃圾收集,get()將返回null。因此,將get()分配給變量f然後檢查它是否是安全的。 – 2011-08-13 03:03:40
另一種方法是在將標籤添加到活動時將標籤放在碎片上。
舉例來說,如果你動態地添加4個片段,你可以將它們添加喜歡:
for (int i = 0; i < NUM_FRAGMENTS; i++){
MyFragment fragment = new Fragment(i);
fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit()
}
然後,如果你需要得到所有的碎片回來以後,你可以這樣做:
for (int i = 0; i < NUM_FRAGMENTS; i++) {
String tag = SOME_CUSTOM_PREFIX + i;
fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag));
}
如果你使用Android支持庫,然後就可以調用隱藏FragmentManager.getFragments()
方法:
public List<Fragment> getVisibleFragments() {
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
if (allFragments == null || allFragments.isEmpty()) {
return Collections.emptyList();
}
List<Fragment> visibleFragments = new ArrayList<Fragment>();
for (Fragment fragment : allFragments) {
if (fragment.isVisible()) {
visibleFragments.add(fragment);
}
}
return visibleFragments;
}
我們不應該使用這種方法。它用'@ hide'標記,不應該包含在支持庫jar中。它不應被視爲導出的API的一部分。 – 2014-03-25 06:44:14
如果您正在使用支持庫並瞭解內部內容,則可以調用所需的任何方法。可能發生的最糟糕的事情是,在切換到較新版本的庫之後,會出現編譯錯誤。 – Michael 2014-03-25 09:10:03
@Michael我希望爲未來的觀衆提供這種方法的一個重要事項(它看起來像你已經在這裏討論過)是它返回內部片段列表,而不是它的副本。所以不要修改你回來的列表;根據返回的響應實例化一個新的List,並修改*那一個。否則,您將花費整整一天來調試間歇性的IndexOutOfBoundsException。 :) – kcoppock 2014-05-03 01:11:49
我解決這個:
public ArrayList<Fragment> getAllFragments() {
ArrayList<Fragment> lista = new ArrayList<Fragment>();
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
try {
fragment.getTag();
lista.add(fragment);
} catch (NullPointerException e) {
}
}
return lista;
}
我正在實現類似於這個的東西,我得到一個NPE該活動被重新創建,並調用fragment.getTag()。你知道爲什麼片段是空的嗎? – Clocker 2014-11-14 15:11:40
對不起,但沒有。只爲我工作。 – 2014-12-11 17:17:09
android.support.v4.app.FragmentManager
有一個名爲getFragments()
這不正是你需要的方法,但它從來沒有訪問。突然,雖然,但是,我不確定這是否意圖是因爲它仍然被標記爲隱藏。
/**
* Get a list of all fragments that have been added to the fragment manager.
*
* @return The list of all fragments or null if none.
* @hide
*/
public abstract List<Fragment> getFragments();
常規android.app.FragmentManager
沒有這個方法可言,但如果真的需要,可以通過反射得到場mActive
訪問同一個對象(小心有:首先是API 26,它的類型是一個SparseArray
而不是List
)。請自行承擔風險:)
該方法是公開的,但[它有一個錯誤](https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner% 20Summary%20Stars&groupby =&sort = -id&id = 226196) – 2016-11-16 15:44:53
迭代過程中的空檢查修復了這個錯誤。 – 0101100101 2016-11-22 08:50:11
它可用於android.app.FragmentManager! – 2016-12-05 10:58:04
- 1. 有沒有一種方法可以在android studio中調用其他一些活動的單個活動?
- 2. Android:如何創建一個方法可以從所有的活動和片段?
- 3. 有沒有一種方法可以檢查活動進程的環境變量?
- 4. 有沒有辦法顯示一個片段內的活動
- 5. 有什麼方法可以獲取特定城市的所有Facebook活動?
- 6. 有沒有辦法讓所有活動都可用的功能?
- 7. 從活動中獲取當前可見片段
- 8. 所有活動的活動
- 9. 活動沒有顯示所有的片段
- 10. 有沒有一種可靠的方式來啓動Android的啓動活動?
- 11. 有沒有辦法在創建後從活動組中獲取變量到當前活動中?
- 12. javax.persistence.TransactionRequiredException:當前沒有活動的事務
- 13. Sharepoint沒有從活動目錄獲取當前用戶NetworkCredential
- 14. 是否有可能沒有活動的片段?
- 15. 獲取當前活動會話的所有進程
- 16. 有沒有什麼辦法可以檢測IE8當前活動的窗口?
- 17. 在全屏活動中有一個片段活動
- 18. 有沒有辦法從活動的另一個活動恢復
- 19. 以前的活動沒有得到
- 20. 基於活動的應用程序可以沒有活動嗎?
- 21. 所有活動
- 22. 活動沒有更新以前的活動TextView
- 23. 使得在一個活動中獲得的數據可用於所有活動
- 24. 有沒有更好的方法來完成另一項活動的活動?
- 25. 如何獲取所有的Facebook活動?
- 26. 從片段中完成當前活動
- 27. 在ClearCase活動的非所有者可以提供活動
- 28. 活動中沒有PSVM()方法。
- 29. 在非View類中以靜態方法獲取當前活動
- 30. 沒有活動當在片段中使用viewpager和片段時出現異常
你的用例是什麼? – 2011-08-11 13:57:41