2013-02-18 72 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()(即:执行标准的后退按钮行为) 。