FragmentTransaction:replace和addToBackStack不能一起工作?

 ____L振豪 发布于 2023-02-09 12:26

我是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()方法,它像我预期的那样再次工作(一次在容器中有1个片段)

基本上,手动删除片段而不是popFromBackStack方法

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();
    }
}

所以,我的问题是

替换和addToBackStack不一起工作?

或者,我做错了什么?

感谢所有意见和建议.

1 个回答
  • addToBackstack创建片段状态的快照.这意味着当您按下后退按钮时,实际上您将恢复到上次addToBackstack调用的状态.

    在您的情况下,您添加片段.后退按钮将删除此添加的片段.当你调用replace并再次添加到backstack时,你现在在backstack上有两个状态(1.当你添加了第一个片段时,2.当你没有添加片段时).如果您使用后退按钮删除当前片段,则不要使用addToBackstack.如果要保留视图中片段的状态,请仅使用addToBackstack.

    2023-02-09 12:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有