Android 碎片不会从背面弹出来吗?

Android 碎片不会从背面弹出来吗?,android,android-fragments,fragment-backstack,Android,Android Fragments,Fragment Backstack,我有三个片段A,B和C 这是路径:A->B->C:A转到B和B转到C 当我从片段C返回时,我想转到片段A A由于backpress不会弹出存储的事务,因此您没有将fragC添加到backstack,因此它不会被删除。相反,您必须通过覆盖backpress来删除片段。Overiride backpress并检查fragC并将其删除,然后调用pospstack弹出存储的事务 还将片段实例存储为全局,以检查片段是否为fragC private Fragment mFragment; 在方法中存储

我有三个片段A,B和C

这是路径:A->B->C:A转到BB转到C

当我从片段C返回时,我想转到片段A


  • A由于backpress不会弹出存储的事务,因此您没有将fragC添加到backstack,因此它不会被删除。相反,您必须通过覆盖backpress来删除片段。Overiride backpress并检查fragC并将其删除,然后调用pospstack弹出存储的事务

    还将片段实例存储为全局,以检查片段是否为fragC

    private Fragment mFragment;
    
    在方法中存储实例

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName());
            if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) {
                getSupportFragmentManager().beginTransaction().remove(mFragment).commit();
            }
            getSupportFragmentManager().popBackStackImmediate();
        } else {
            super.onBackPressed();
        }
    }
    

    根据@Anonymous的回答,我找到了这个问题的一般解决方案:

      @Override
        public void onBackPressed() {
            Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
            super.onBackPressed();
    
            if(currentFragment!=null && currentFragment.isVisible()) {
                getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
                getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }
    
        }
    

    共享您的xml文件。在xml文件中,我只在片段中添加了一个简单的textview,并在活动中添加了一个frameLayout。无论如何,这是示例的链接:我检查了您的代码,我没有在片段xml文件中设置背景色。这就是它重叠的原因。将背景色设置为片段A、B、C的父视图,您将永远不会再次遇到此问题。添加颜色不会从backbackback中删除片段。您需要为第一个片段调用add(而不是replace),然后为所有其他片段使用replace。OnBack按use code getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_包括在内);当我从C返回时,我将我重定向到A,这是正确的。但是当我从B回来的时候,它在B里卡住了。而且,我在寻找一个解释,为什么在我的例子中C没有从backback中清除?很抱歉,这是一个轻微的错误。请参阅更新的代码。您没有将C添加到backbackback中。因此,它不会在backpress中被删除。添加到backbackback中的片段仅是当按back时将被清除的片段。通过add,替换并添加StackToBackStack。然后你会清楚地理解它。希望我的回答能帮助你:)欢迎你。你可以覆盖backpress,但不应该弄乱android系统的backpress方法。如果你添加更多的片段,你可以检查并删除backpress中的片段。
      @Override
        public void onBackPressed() {
            Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
            super.onBackPressed();
    
            if(currentFragment!=null && currentFragment.isVisible()) {
                getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
                getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }
    
        }