Android 如何在遍历片段回栈期间刷新ActionBar导航项?

Android 如何在遍历片段回栈期间刷新ActionBar导航项?,android,android-fragments,android-actionbar,Android,Android Fragments,Android Actionbar,Android 4.1 ActionBar提供了一个有用的导航模式,可以是列表或选项卡。我正在使用SpinnerAdapter从要显示在view android.R.id.content中的三个片段中进行选择。 onNavigationItemSelected侦听器然后将每个片段膨胀到视图中,并使用FragmentTransaction.addToBackStacknull将其添加到后堆栈中 这一切都是宣传的,但我不知道如何更新ActionBar以反映当前的后台堆栈。使用ActionBar.se

Android 4.1 ActionBar提供了一个有用的导航模式,可以是列表或选项卡。我正在使用SpinnerAdapter从要显示在view android.R.id.content中的三个片段中进行选择。 onNavigationItemSelected侦听器然后将每个片段膨胀到视图中,并使用FragmentTransaction.addToBackStacknull将其添加到后堆栈中

这一切都是宣传的,但我不知道如何更新ActionBar以反映当前的后台堆栈。使用ActionBar.setSelectedNavigationItemposition可以工作,但也会触发一个新的OnNavigationListener,这也会创建另一个FragmentTransaction,而不是我想要的效果。代码如下所示,以供澄清。感谢您对解决方案的任何帮助


你可以这样做:

根据“后退”按钮选择导航项目时,创建要跟踪的布尔值:

private boolean mListIsNavigatingBack = false;
Override onBackPressed,在Override中,检查backbackback是否有项,如果有,请自行处理,如果没有,请调用超类:

public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() > 0){
        mListIsNavigatingBack = true;

        //You need to get the previous index in the backstack through some means
        //possibly by storing it in a stack
        int previousNavigationItem = ???;

        getActionBar().setSelectedNavigationItem(previousNavigationItem);
    }
    else{
        super.onBackPressed();
    }
}
在NavigationListener中,处理mListIsNavigatingBack状态,手动弹出后堆栈并取消设置状态:

if(mListIsNavigatingBack){
    if(fm.getBackStackEntryCount() > 0){
        fm.popBackStack();
    }
    mListIsNavigatingBack = false;
}

感谢您的建议,我用堆栈实现了这些建议。考虑到增加的复杂性和独特的用户体验,我正在重新考虑这个设计模式。在使用ActionBar导航时,最好不要添加BackStack?列表导航确实会使它变得复杂。通常,后堆栈更多地用于交换当前视图中的片段,因此,也许可以通过重新附加背景中的片段来简化用例。
if(mListIsNavigatingBack){
    if(fm.getBackStackEntryCount() > 0){
        fm.popBackStack();
    }
    mListIsNavigatingBack = false;
}