簡體   English   中英

如何使用基於標記的另一個片段替換片段管理器中的現有片段

[英]how to replace existing fragment in a fragment manager with another fragment based on tag

我有一個活動,將使用片段顯示數據,對於每個片段,我給出唯一的ID作為標簽,如下所示:

public class MyActivity .... {

    void addFragment(String id){
        // this is how i add a new fragment
        FragmentTransaction fTrans = getFragmentManager().beginTransaction();

        AnyFragment frag = new AnyFragment();

        fTrans.add(R.id.container, frag, id);
        fTrans.commit();
    }

    void replaceFragment(String id){
        // this is how i replace the fragment with tag 'id' with new fragment
        FragmentTransaction fTrans = getFragmentManager().beginTransaction();

        AnyFragment newFrag = new AnyFragment();
        fTrans.replace(R.id.container, newFrag, id);
        fTrans.commit();
    }

}

在我的例子中,我添加了2個帶有標簽' data1 '和' data2 '的片段。

當我試圖用標簽' data1 '或' data2 '替換片段時,它總是替換添加的片段,當我第二次替換時,它會替換第二個添加的片段。

當我更換3次時,它只留下一個片段而另一個片段消失了。

我的問題是:

我想用一個新的片段替換帶有指定標簽的片段,怎么做? 在我的代碼中替換有什么問題?

我可以使用替換方法嗎? 或者我必須首先使用指定標簽刪除片段然后添加具有相同標簽的新片段? 這樣做的最佳方法是什么? 如果你能為每種方法提供一些解釋,那就太好了。

任何答案將不勝感激,謝謝!

在你的情況下,你真的不需要標簽:

檢查Android Developer上的方法說明

替換添加到容器的現有片段。 這與使用相同的containerViewId添加的所有當前添加的片段調用remove(Fragment),然后使用此處給出的相同參數添加(int,Fragment,String)基本相同。

所以你要做的就是:

  1. 在Activity的onCreate()期間(或者實際需要實例化片段時) - 使用新片段填充容器: getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();

  2. 一旦你需要用FragmentB替換FragmentA,你只需要調用getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentB.class.getName())).commit(); (即需要標簽 - R.id.container同時只有一個片段)

如果您不想replace片段(這是首選解決方案),您可以在活動的onCreate()add()兩個片段,然后分別使用show()hide()方法:

    Fragment fragmentA = Fragment.instantiate(this, FragmentA.class.getName());
    Fragment fragmentB = Fragment.instantiate(this, FragmentA.class.getName());
    ..
    getSupportFragmentManager().beginTransaction()
            .add(R.id.container, fragmentA)
            .add(R.id.container, fragmentB)
            .show(fragmentA)
            .hide(fragmentB)
            .commit();

    ..
    // Once you want to show fragment B instead of fragment A
    getSupportFragmentManager().beginTransaction()
            .show(fragmentB)
            .hide(fragmentA)
            .commit();

UPD:關於現有片段的編輯:

在您的Activity中,一旦發生某些事情並且您想要更新片段 - 請執行以下操作:

  1. onCreate() (或任何其他合適的地方),你將片段添加到容器( R.id.container ): getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();

  2. 在您要更新的位置 - 執行以下操作:

     Fragment f = getSupportFragmentManager().findFragmentById(R.id.container); if (f instanceof FragmentA) { // doSomething() is a public method of FragmentA; ((FragmentA)f).doSomething(); } 

我希望,這有幫助

暫無
暫無

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

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