最好的方法是利用 android 提供的接口 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) 相应地设置了操作栏标题,其中标题存储了适当的标题名称。
每当我们从导航抽屉中单击项目时,都会根据单击给用户的项目显示一个片段。但是在后端,这个片段被添加到 backstack 并且方法 onBackStachChanged() 被命中。我所做的是我创建了一个变量 mPreviousBackStackCount 并将其初始化为 0。我还创建了一个额外的堆栈来存储操作栏标题名称。每当我向后台堆栈添加一个新片段时,我都会将相应的标题名称添加到我创建的堆栈中。在另一侧,每当我按下后退按钮时,都会调用 onBackStackChanged(),并从堆栈中弹出最后一个标题名称,并将标题设置为堆栈的 peek() 方法派生的名称。
例子:
假设我们的 android backstack 是空的:
从导航抽屉中按选择 1:调用 onBackStachChanged() 并将 Fragment 1 添加到 android backstack,backStackEntryCount 设置为 1,将 Frag1 推送到我的堆栈,并且 mFragPositionTitleDisplayed 的大小变为 1。
从导航抽屉中按选择 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() 标题并将操作栏设置为该标题。
请记住:要设置动作蝙蝠标题使用 peek() 而不是 pop() 否则当您打开超过 2 个片段并尝试按返回按钮返回时,您的应用程序将崩溃。