2014-09-19 52 views
14

我遇到一個奇怪的問題,同時使用Fragments並彈出它們。Fragment PopBackStack

我有一個片段活動:

第一步:我在名爲片段A的啓動將一個片段,該活動的OnCreate爲:

這是片段的的onCreate活動

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit(); 
    } 

步驟:2之後我已添加替換片段用下面的代碼:

Fragment_More moreFragment = new Fragment_More(); 
      FragmentManager manager = getSupportFragmentManager(); 
      manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit(); 

第3步:在那之後,我再次以同樣的方式增加了一個片段上Fragment_More:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand(); 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit(); 

,這裏是我的碎片的活動onBackPressedButton Lisetener:

@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment f = fm.findFragmentById(R.id.frameContent); 

if(fm.getBackStackEntryCount() > 1){ 
     fm.popBackStack(); 
    } else{ 
     finish(); 
    } 
} 

這是問題所在我得到:

當我從步驟3回來,它給了我以前的片段成功,如上所述BackPressed,它會彈出窗口並將我帶到以前的片段。但是從Fragment_More,當我再次按下時,它會顯示空白的FRAGMENT內容。它從不顯示我在活動的OnCreate的第1步添加的第一個片段。

請評論。我做錯了什麼?

感謝

+0

您能否爲我們提供您使用的片段的片段類? – 2014-09-22 13:56:29

+0

我實際上看不到任何錯誤,實際上我已經複製了你描述的內容(儘可能多),它工作正常。我猜你的代碼中有些東西沒有顯示出來..我注意到你正在改變另一個片段內的活動片段,這可能導致麻煩(你可能想要考慮從你的活動中使用一個監聽器)。 – 2014-09-23 09:19:17

+0

檢查這個http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments – 2016-01-04 10:56:29

回答

38

你應該不是你的第一個片段添加到堆棧中,短按返回鍵將只是扭轉你做的動作。因此,如果您替換一個片段,然後向後按,它會逆轉您所做的替換。但是如果你按下'.add()'分段交易,它會簡單地將其刪除並顯示一個空白頁面。所以我認爲從後臺堆棧中移除第一個片段應該能夠解決問題。試試看,讓我知道!

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).commit(); 
    } 

例:

所以我們可以說你有兩個片段稱爲一個 &

如果.add()片段一個頁面,而 「addToBackStack()」( =保存動作的反向)您將保存REMOVE片段A作爲您單擊後退時的操作。

如果.replace()片段一個通過片段,也「addToBackStack()」你會保存在刪除並添加一個當你點擊後面的動作。

所以,你明白爲什麼把你的第一個fragmenttransaction添加到backstack並不好?這會導致刪除片段A後退,導致空白頁。希望這是足夠的信息。

此外,一旦您將addToBackStack()刪除到您的第一個片段,則不需要覆蓋onBackPressed(),因爲它可以工作。只有在沒有顯示空白頁面的情況下,堆棧中沒有任何內容時,它纔會完成活動。

0

您使用此 manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

嘗試用這個代替 manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

讓我知道它是否適合ü

+0

不,它沒有幫助 – 2014-09-19 12:11:19

+0

你能試試我的答案@GauravArora? – Chris 2014-09-19 12:48:00

+0

是的,我曾試過,只有我回復了你 – 2014-09-22 05:12:41

2

你行:

if(fm.getBackStackEntryCount() > 1){ 

應該是:

if (fm.getBackStackEntryCount() > 0) { 

您正在將3個碎片放在背後。在關閉前兩個條目之後,後臺堆上的條目數等於1.因此,您可以防止自己檢索添加到後臺堆的第一個片段。