我对android的开发还不太熟悉,现在开始接触怪异的行为。
我有一个空的framelayout作为片段的容器。
如果用户第一次按下按钮,生成新片段并放入容器中。
如果用户稍后按下某个按钮,并且容器中存在现有片段,请将现有片段替换为新生成的片段。
如果用户按下后退按钮,弹出容器内的碎片。
这是我的密码

public void showFragment(View v) {
    FragmentA f = new FragmentA();

    FragmentManager fm = getSupportFragmentManager();
    String tag = f.getFragmentTag(); // instance method of a to get a tag

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top);
    ft.replace(R.id.container, f, tag);
    ft.addToBackStack(tag);
    ft.commit();
}

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
    } else {
        super.onBackPressed();
    }
}

当用户第一次按下按钮时,它的行为和我期望的一样,将新片段添加到容器中。但是,当容器仍然包含一个片段时,用户第二次按下按钮时,它不是替换,而是在现有片段的基础上添加新的片段。所以,容器内有2个碎片,2个背压移除所有碎片。
我发现如果我把线移走
ft.addToBackStack();

然后像下面一样重新编写onbackpress()方法,它再次像我期望的那样工作(一次在容器中有一个片段)
基本上,手动移除片段而不是popfrombackbackback方法
private FragmentA currentFragment = null; // to hold the reference to exising fragment, if any.

@Override
public void onBackPressed() {
    if (currentFragment != null) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.setCustomAnimations(0, R.anim.slide_out_top);
        ft.remove(currentFragment);
        ft.commit();

        currentFragment = null;
    } else {
        super.onBackPressed();
    }
}

所以,我的问题是
replace和addToBackStack不在一起工作?
或者,我做错什么了吗?
感谢所有的意见和建议。

最佳答案

addToBackstack创建片段状态的快照。这意味着当您按下back按钮时,实际上您正在恢复到上次调用addToBackstack的状态。
在你的例子中,你添加了一个片段。后退按钮将删除添加的片段。调用replace并再次添加到backback时,backback上现在有两个状态(1)。当你添加第一个片段时,2。当你没有添加碎片时)。如果使用“上一步”按钮删除当前片段,则不使用addToBackStack。仅当要保留视图中片段的状态时,才使用addtobackstack。

08-17 23:45