【问题标题】:getBackStackEntryCount() always returns 0 even after adding addToBackStack and executePendingTransactions()即使在添加 addToBackStack 和 executePendingTransactions() 之后 getBackStackEntryCount() 也总是返回 0
【发布时间】:2015-03-19 15:22:20
【问题描述】:

我有两个活动 A 和 B。活动 A 有一个 mapFragment,我将它添加到后台堆栈。当我从 B 回到活动 A 时,我希望片段以与我离开时相同的状态显示。但是 getFragmentManager().getBackStackEntryCount() 正在返回 0。这是我的代码:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.replace(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

从活动 B 回来时,我知道 getBackStackEntryCount() 的数量:

System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());

这显示我是 0。

提前致谢。

【问题讨论】:

    标签: android fragmentmanager


    【解决方案1】:

    我遇到了类似的问题,在我的情况下,getFragmentManager().getBackStackEntryCount() 总是返回零。

    我的问题是我使用了支持片段:

    Fragment fragment = new MyFragment();
    // note getSupportFragmentManager() instead getFragmentManager()
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
    .replace(R.id.frame, fragment)
    .addToBackStack(null)
    .commit();
    
    fragmentManager.executePendingTransactions();
    

    我检查了getFragmentManager()backStackEntryCount,它总是返回零(它正在使用另一个片段管理器):

    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0 ) {
            getFragmentManager().popBackStack();            
        }
    }
    

    而不是getSupportFragmentManager,它返回正确的数字:

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0 ) {
            getSupportFragmentManager().popBackStack();         
        }
    }
    

    【讨论】:

    • s,当我将 getFragmentManager() 更改为 getSupportFragmentManager() 时,它确实有效。谢谢你的回答..
    • 但是为什么呢?我正在使用普通 Fragment 和普通 Fragment Manager,我怎么知道 FM - common 或 support 以防万一?
    • 这取决于你是导入 android.support.v4.app.FragmentManager 还是 android.app.FragmentManager
    【解决方案2】:

    试试这个:

    MapFragment mMapFragment = MapFragment.newInstance();
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        mMapFragment.getMapAsync(this);
        fragmentTransaction.add(R.id.container, mMapFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        getFragmentManager().executePendingTransactions();
    

    我改变了这一行:

    fragmentTransaction.replace(R.id.container, mMapFragment);
    

    到这里:

    fragmentTransaction.add(R.id.container, mMapFragment);
    

    很确定如果你替换一个片段,那么它不在后台堆栈中:)

    【讨论】:

    • 除了切换replace()add() 你还需要添加.addToBackStack(null)
    【解决方案3】:

    我也有类似的问题。感谢this answer 我在我的活动中创建了下面的代码,而不是片段,这个解决方案工作正常:

    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                Log.d("ovech", "back stack changed");
                Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount());
                if(getSupportFragmentManager().getBackStackEntryCount()>0) {
                    toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);
                } else {
                    toolbar.setNavigationIcon(null);
                    Log.d("ovech", "hello without icon");
                }
                toolbar.invalidate();
            }
        });
    

    【讨论】:

      【解决方案4】:

      问题在于您如何添加和删除片段。

      如果您使用 supportFragmentManager 添加,则必须将 supportFragmentManager 与 backStackEntryCount 一起使用。

      如果你使用 fragmentManager 添加那么你应该使用 fragmentManager 来获取碎片的数量(backStackEntryCount)

      // **Kotlin**
      // AddFragment
      val ft = supportFragmentManager.beginTransaction()
      ft.replace(R.id.activity_base_content, f)
      ft.addToBackStack(null)
      ft.commit()
      
      // Get amount of fragments 
      supportFragmentManager.backStackEntryCount
      

      【讨论】:

        【解决方案5】:

        我有另一个解决方案(四处走走)来检测碎片,因为在我的示例中 FM.getBackStackEntryCount() 也返回 0 并且 FM.executPendingTransactions 不起作用。

        下面是我添加新片段的方法:

        getFragmentManager().beginTransaction()
                                .add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
                                .setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
                                .commit();
        

        这是我删除它的方法:

        Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
                if(prevTool != null){
                    getFragmentManager().beginTransaction().remove(prevTool).commit();
                }else {
                    intentCANCELED();
                }
        

        最初成立here

        【讨论】:

          【解决方案6】:

          只需将 getFragmentManager() 替换为 getSupportFragmentManager() 即可。简单的解决方案。它对我有用。 您需要在 Activity 上执行此操作

          【讨论】:

            【解决方案7】:

            google 已弃用getFragmentManager(),因此请始终使用getSupportFragmentManager()

            Check Here 了解更多信息。

            【讨论】:

              【解决方案8】:

              如果您使用的是 childFragmentManager.beginTransaction() ,请尝试使用 parentFragmentManager.beginTransaction() (用于我们扩展 Fragments 的情况,例如 BaseFragment 并在其中添加/替换。)

              【讨论】:

                猜你喜欢
                • 2021-08-03
                • 1970-01-01
                • 2012-07-14
                • 2013-09-05
                • 1970-01-01
                • 1970-01-01
                • 2017-10-01
                • 2011-07-16
                相关资源
                最近更新 更多