簡體   English   中英

Android - 限制backStack中的片段數量?

[英]Android - limit number of fragments in backStack?

目前我有一個活動,並且正在添加片段(搜索,歌曲詳細信息,設置等)。 我實現了基於側面的菜單導航,所以現在,作為副作用,tehre對於將多少碎片添加到Backstack沒有限制。 有什么方法可以限制片段數量,或刪除舊條目? 例如,每首歌曲細節片段,有一個推薦的歌曲列表,並通過你可以去另一個歌曲細節片段。 在Backstack中很容易有30個片段,如果你打開DDMS,你可以看到堆大小緩慢(但肯定)增加。

編輯:我嘗試做的一件事是,如果用戶點擊其中一個側邊菜單選項,如果該片段已經在后台堆棧中嘗試返回到該片段而不是實例化新片段,但當然,如果用戶在歌曲詳細信息頁面上,然后他會期望按下它會將他帶到那個片段,這樣就行不通了。

編輯2:這是我的addFragment方法(以及Phil的建議):

public void addFragment(Fragment fragment) { 

        FragmentManager fm = getSupportFragmentManager();
        if(fm.getBackStackEntryCount() > 2) {

              fm.popBackStack();
            }
        fm.beginTransaction()                 
                  .replace(R.id.fragment_container, fragment).addToBackStack("")
                  .commit();
}

我只是試了一下,假設我的片段歷史是:A-> B-> C-> D,從D回來,去B-> A->退出。

我只是進了8級測試:A-> B-> C-> D-> E-> F-> G-> H,從H回來,同樣的事情發生了:H-> B-> A- >退出。

所有碎片都是通過上面的方法添加的。 我想看到的是:H-> G-> F->退出。

您可以以編程方式控制BackStack中的碎片數量:

FragmentManager fm = getActivity().getSupportFragmentManager();

if(fm.getBackStackEntryCount() > 10) {

   fm.popBackStack(); // remove one (you can also remove more)
}

只需檢查Backstack中有多少碎片,如果有“溢出”則刪除。

如果要從BackStack中刪除特定的碎片 ,則必須實現自己的BackStack並覆蓋onBackPressed()。 由於Fragment BackStack是一個Stack(如名稱所示),因此只能移除頂部元素(最后添加的元素),因此不可能在其間刪除Fragments。

你可以使用例如

ArrayList<Fragment>

實現自己的堆棧。 只要你想要並通過覆蓋onBackPressed()方法來處理先前片段的加載, 只需添加和刪除那個“堆棧”中的碎片 (它不再是堆棧)。

這是一個老問題,但我的回答可能對某人有所幫助。

為什么不檢查片段是否在堆棧中並彈出它? 這樣你就不必擔心后面的堆棧大小(除非你有很多碎片)。

    String backStateName = fragment.getClass().getName();
    boolean fragmentPopped = false;
    try {
        // true if fragment is in the stack
        fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }

    FragmentTransaction ft = fragmentManager.beginTransaction();

    if ( !fragmentPopped ) { //fragment not in back stack, add it...            
        ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE );
        ft.replace(R.id.main, fragment);
        ft.addToBackStack( backStateName );

        try {
            ft.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }           
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM