2013-02-18 66 views
0

我遇到了解決此問題的問題。手動訪問Android後退堆棧

基本上我在我的ActionBar中加載了選項卡。當每個被觸摸時,前一個選項卡中的片段將被分離,並且新選項卡的片段將使用替換(如果它們還沒有被實例化)或附加(如果它們具有)來添加。我想我從Google那得到了這個方法,到現在爲止工作正常。

添加標籤的片段的示例:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {   
     if(browser == null) { 
      browser = CourseBrowserFragment.newInstance(false); 
      fragmentTransaction.replace(leftContainerId, browser); 
     } else { 
      fragmentTransaction.attach(browser); 
     } 

     if(lessonViewer == null) { 
      lessonViewer = LessonViewerFragment.newInstance(false); 
      fragmentTransaction.replace(rightContainerId, lessonViewer); 
     } else { 
      fragmentTransaction.attach(lessonViewer); 
     } 
} 

和除去:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {   
     if(browser != null) { 
      fragmentTransaction.detach(browser); 
     } 
     if(lessonViewer != null) { 
      fragmentTransaction.detach(lessonViewer); 
     } 
} 

問題從佈局我需要的選項卡之一出現。基本上它就像Gmail應用程序。有兩個片段(比方說A面板和B面板),當您按下面板A時,面板A滑出,面板B滑動到面板A的舊位置,而新的第三個面板(面板C)從右側滑入。

我有這個工作正常,但現在我已經將滑入式FragmentTransaction添加到後堆棧,以便用戶可以觸摸後退按鈕,並且Panel C將滑回並且Panel A將回來。再次像Gmail一樣。

除用戶轉到不同的選項卡上時,該事務仍在反向堆棧上,並在用戶按下時執行。片段最終在瘋狂的地方。當用戶導航到不同的選項卡時,我需要做的是將其從後退堆棧中移除。有什麼辦法可以做到這一點? FragmentManager似乎沒有讓你手動從背面堆棧中移除東西,而使用popBackStack()方法不僅僅是移除事務,而是執行它。我想在用戶導航時將其刪除,並在用戶返回時將其放回。

我想我可以通過使用「getBackStackEntryAt」來獲得這個事務的「返回堆棧條目」,但如果我不能刪除它並在用戶返回時將它放回原處並不好標籤。

我能想到的唯一可能的解決方案是不使用back棧並重寫onBackButtonPressed。如果有必要,我可以從那裏做一筆交易。

感謝您的任何幫助和抱歉,如果我是不連貫的。

回答

0

不知道這是否可以作爲解決方案,但我最終只是沒有將交易添加到後退堆棧,而只是在用戶刷新或回退時執行新的交易。這個交易剛剛做了與原動畫相反的動畫等。

我管理後退按鈕的方式是如果我在顯示Panel C的佈局中設置布爾值爲true。如果用戶滑回Panel佈局或導航離開布爾值設置爲false。然後,我重寫Activity中的onBackButtonPressed方法,如果布爾值爲true(即:我們在Panel C佈局中),則運行該反向事務,否則我只調用super.onBackButtonPressed()(即:執行標準的後退按鈕行爲) 。