最好的方法是利用android提供的Interface OnBackStackChangedListener方法onBackStackChanged()。
假设我们有一个带有4个选项的导航抽屉,用户可以导航到这些抽屉。在这种情况下,我们将有4个片段。首先让我们看一下代码,然后我将解释其工作原理。
private int mPreviousBackStackCount = 0;
private String[] title_name = {"Frag1","Frag2","Frag3","Frag4"};
Stack<String> mFragPositionTitleDisplayed;
public class MainActivity extends ActionBarActivity implements FragmentManager.OnBackStackChangedListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
....
....
getSupportFragmentManager().addOnBackStackChangedListener(this);
mFragPositionTitleDisplayed = new Stack<>();
}
public void displayFragment() {
Fragment fragment = null;
String title = getResources().getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Fragment1();
title = title_name[position];
break;
case 1:
fragment = new Fragment2();
title = title_name[position];
break;
case 2:
fragment = new Fragment3();
title = title_name[position];
break;
case 3:
fragment = new Fragment4();
title = title_name[position];
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container_body, fragment)
.addToBackStack(null)
.commit();
getSupportActionBar().setTitle(title);
}
}
@Override
public void onBackStackChanged() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if(mPreviousBackStackCount >= backStackEntryCount) {
mFragPositionTitleDisplayed.pop();
if (backStackEntryCount == 0)
getSupportActionBar().setTitle(R.string.app_name);
else if (backStackEntryCount > 0) {
getSupportActionBar().setTitle(mFragPositionTitleDisplayed.peek());
}
mPreviousBackStackCount--;
}
else{
mFragPositionTitleDisplayed.push(title_name[position]);
mPreviousBackStackCount++;
}
}
在所示的代码中,我们具有displayFragment()方法。在这里,我根据从导航抽屉中选择的选项显示片段。变量位置对应于从导航抽屉中的ListView或RecyclerView单击的项目的位置。我使用getSupportActionBar.setTitle(title)相应地设置了操作栏标题,其中标题存储了适当的标题名称。
每当我们从导航抽屉中单击该项目时,就会根据用户单击的项目显示一个片段。但是在后端,这个片段被添加到了堆栈中,并且方法onBackStachChanged()被击中。我所做的是创建了一个变量mPreviousBackStackCount并将其初始化为0。我还创建了一个额外的堆栈,用于存储操作栏标题名称。每当我向后堆栈中添加新片段时,都会将相应的标题名称添加到创建的堆栈中。相反,每当我按下后退按钮onBackStackChanged()时,就会从堆栈中弹出最后一个标题名称,并将标题设置为由堆栈的peek()方法派生的名称。
例:
可以说我们的android backstack是空的:
从导航抽屉中按选择1:调用onBackStachChanged()并将Fragment 1添加到android backstack,将backStackEntryCount设置为1,并将Frag1推入我的堆栈,并且mFragPositionTitleDisplayed的大小变为1。
从导航抽屉中按Choice 2:调用onBackStachChanged()并将Fragment 2添加到android backstack,将backStackEntryCount设置为2,并将Frag2推入我的堆栈,并且mFragPositionTitleDisplayed的大小变为2。
现在,我们在Android堆栈和我的堆栈中都有2个元素。当您按下后退按钮时,将调用onBackStackChanged(),并且backStackEntryCount的值为1。代码将输入if部分,并从堆栈中弹出最后一个条目。因此,android backstack只有1个片段-“ Fragment 1”,而我的堆栈只有1个标题-“ Frag1”。现在,我只是从堆栈中窥视()标题,并将操作栏设置为该标题。
请记住:要设置动作蝙蝠标题,请使用peek()而不是pop(),否则当您打开两个以上的片段并尝试按“后退”按钮返回时,应用程序将崩溃。
getActivity().setTitle(...)
),但这是一种合理的方法。谢谢。