2016-04-27 125 views
1

我所要做的是在onBackPressed我想創建頂部片段的一個新的對象,所以我想這個代碼:刪除堆棧中的頂部片段

if (getFragmentManager().getBackStackEntryCount() > 1) { 
    FragmentManager.BackStackEntry backEntry =getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1); 
    String Back_fragment_name=backEntry.getName(); 
    if(Back_fragment_name.equals("Frag1")){ 
     Frag1 frag = new Frag(); 
     getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag1").commit(); 
    }else if(Back_fragment_name.equals("Frag2")){ 
     Frag2 frag = new Frag2(); 
     getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag2").commit(); 
    }else if(Back_fragment_name.equals("Frag3")){ 
     Frag3 frag = new Frag3(); 
     getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag3").commit(); 
    } 
    //getFragmentManager().popBackStack(); //Wrong 
} else{ 
    super.onBackPressed(); 
} 

問題是,我想那應該刪除來自BackStack的頂部片段,但使用popBackStack是錯誤的,因爲它顯示了頂部片段,我只需要將它從BackStack中移除。

任何想法?

+0

首先使用ID或標籤獲取片段片段fragment1 = fragmentManager.findFragmentByTag(tag); ()刪除片段使用getFragmentManager()。beginTransaction()。remove(frag) – Pehlaj

+0

'beginTransaction()。remove(frag)'將從活動中刪除片段,但不從BackStack中刪除 –

+0

@AtefHares - 不確定這是你需要正確..試試這個 - int backStackCount = mFragmentManager.getBackStackEntryCount(); // Get backstack fragment id int backStackId = mFragmentManager.getBackStackEntryAt(backStackCount -1).getId(); mFragmentManager.popBackStack(backStackId,FragmentManager.POP_BACK_STACK_INCLUSIVE); –

回答

0

我想要做的是實現onBackPressed,即按回按鈕將處理前一個片段,但我不想處理前一個實例,而是一個新的實例,所以我使用了問題的代碼。要做到這一點,我正在向BackStack添加片段,以便知道哪個片段是前一個[Backstack的最頂層],然後創建一個新的實例。所以我得到它的名字,然後創建它的新實例,然後從BackStack刪除它[這是問題,我無法從後臺堆棧中刪除它]。

最後我想通了,我並不需要使用堆棧中的所有知道什麼是如此例如交易Frag1我做的時候前面的片段我只是用的StringArrayList節省每交易片段的名稱或標記這樣的:

Frag1 frag1 = new Frag1(); 
fragmentTransaction.replace(R.id.RR, frag1 , "frag1").commit(); 
mPreviousFragmentsNames.add("frag1"); 

onBackPressed將是這樣的:

if(!Removed_Last_Fragment_Name_From_backList){ 
// a boolean value, removing this will cause a bad behavior 
// that is if back button pressed it transact current shown fragment first then u need to press back again to go to previous one 
mPreviousFragmentsNames.remove(mPreviousFragmentsNames.size()-1); 
Removed_Last_Fragment_Name_From_backList = true; 
} 

if (!mPreviousFragmentsNames.isEmpty()) { 
    String Back_fragment_name = mPreviousFragmentsNames.get(mPreviousFragmentsNames.size()-1); 
    if(Back_fragment_name.equals("Frag1")){ 
    Frag1 frag = new Frag(); 
    getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag1").commit(); 
    }else if(Back_fragment_name.equals("Frag2")){ 
    Frag2 frag = new Frag2(); 
    getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag2").commit(); 
    }else if(Back_fragment_name.equals("Frag3")){ 
    Frag3 frag = new Frag3(); 
    getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag3").commit(); 
    } 
} else{ 
    super.onBackPressed(); 
} 

和它的偉大工程,需要的話!

+0

我建議你在添加/替換片段時不要使用backstack:D –

+0

你確實做過,但是你沒有給我一種替代方法做我想要的東西:),任何方式感謝您的幫助 –