簡體   English   中英

切換標簽時保持片段狀態

[英]Keep Fragment state when switching tabs

我有4個標簽A,B,C和D。我想保留以前的標簽視圖。 例如:標簽A(默認)-> B->A。返回標簽A時,我希望標簽A的視圖與以前相同

圖:位於四個選項卡(A,B,C,D)頂部的片段A(或B,C或D)

這是我的代碼:

private void replaceFragment(Constants.BottomTab bottomTab) {
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(bottomTab.getValue());
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (fragment == null) {
        switch (bottomTab) {
            case A:
                fragment = new A();
                break;
            case B:
                fragment = new B();
                break;
            case C:
                fragment = new C();
                break;
            case D:
                fragment = new D();
                break;
        }
        transaction.replace(R.id.main_container, fragment,bottomTab.getValue() );
        transaction.addToBackStack(bottomTab.getValue()); // Tag
        transaction.commit();
        Log.v(">>>", "Create fragment: " + fragment.getTag());
    } else { // pop from stack
        transaction.replace(R.id.main_container, fragment, bottomTab.getValue());
        transaction.commit();
        Log.v(">>>", "Found fragment: " + fragment.getTag());
    }
}

從選項卡B切換到選項卡A時,它會不斷重新創建

我知道另一種方法是使用ViewPagerViewPager.setOffscreenPageLimit(4)但是上述代碼的解決方案是什么?

有人可以幫忙嗎? 提前致謝!

作為一個簡單的解決方案,我建議您保留對這些片段的引用,並僅在它們為null時才創建它們。 因此可能是這樣的:

private Fragment aFrag;
private Fragment bFrag;
private Fragment cFrag;
private Fragment dFrag;

private void replaceFragment(Constants.BottomTab bottomTab) {
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(bottomTab.getValue());
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (fragment == null) {
        switch (bottomTab) {
            case A:
                if (aFrag == null) aFrag = new A();
                fragment = aFrag;
                break;
            case B:
                if (bFrag == null) bFrag = new B();
                fragment = bFrag;
                break;
            case C:
                if (cFrag == null) cFrag = new C();
                fragment = cFrag;
                break;
            case D:
                if (dFrag == null) dFrag = new D();
                fragment = dFrag;
                break;
        }
        transaction.replace(R.id.main_container, fragment,bottomTab.getValue() );
        transaction.addToBackStack(bottomTab.getValue()); // Tag
        transaction.commit();
        Log.v(">>>", "Create fragment: " + fragment.getTag());
    } else { // pop from stack
        transaction.replace(R.id.main_container, fragment, bottomTab.getValue());
        transaction.commit();
        Log.v(">>>", "Found fragment: " + fragment.getTag());
    }
}

暫無
暫無

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

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