从backstack弹出时不会调用片段的onResume()

nil*_*ash 17 android android-fragments back-stack

嗨,我正在开发我正在使用的Android应用程序我正在使用单个Activity和3个片段.所以考虑我有3个片段AB C.当我从A切换到B时,我添加Fragment到Backstack和simillar for B to C.现在当我从C点击它时,它显示B和类似的B到A也是如此.

但事情是,当我从C到B或B来到A时,它不会调用onResume()或任何其他生命周期方法Fragment.

我想要做的每件事Fragment我都有不同的头衔ActionBar.所以,在我的代码中,当我从A移动到B或B到c时,我正在更改片段内的活动标题.但是,当我点击它时它不会改变.

实际问题是什么?为什么从后台弹出后它没有呼唤onResume()Fragment?我该如何解决这个问题?需要帮忙.谢谢.

Uma*_*Uma 21

onResume()Fragment被称为只有当Activity被恢复.所以这不会帮助你.即使我现在面临类似的问题.您可以OnBackStackChangedListener在堆栈顶部实现并获取片段名称,并根据该ActionBar名称设置标题.

private FragmentManager.OnBackStackChangedListener getListener()
{
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener()
    {
        public void onBackStackChanged()
        {
            FragmentManager manager = getFragmentManager();

            if (manager != null)
            {
                if(manager.getBackStackEntryCount() >= 1){
                    String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName();
                    Log.i("TOP ON BACK STACK",topOnStack);
                }
                }
            }
    };

    return result;
}
Run Code Online (Sandbox Code Playgroud)


Ped*_*ran 15

尝试使用replace方法,而不是addFragmentTransaction.这项工作对我来说:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

  • 这有效。也许现在应该是公认的答案。 (2认同)

Eri*_*lin 6

正如其他人已经说过的那样,onResume()仅在活动本身恢复时才调用,因此这完全无济于事。

您需要检查是否要在片段事务中添加新片段或替换现有片段:

  • 如果您replace()是前一个片段,那么当您返回该片段时,将从头开始重新创建该片段,因此onCreateView()将再次调用它,并且可以在此处更新工具栏标题。您可能已经这样做了。

  • 如果您add()是一个新片段,则先前的片段仍然存在,仅不可见。回到它时,要由您决定从后堆栈中获取最后一个条目(在片段管理器中使用getBackStackEntryCount()getBackStackEntryAt()),获取相应的Fragment对象(findFragmentByTag()在片段管理器中使用),将该Fragment转换为某个基类,您所有的片段都将继承并调用自定义方法,例如onVisible()对该片段。onVisible()基类的默认实现不执行任何操作。覆盖每个片段,以更新工具栏标题,FAB和其他所需的内容。我也打电话onVisible()来,onResume()以避免代码重复。


Har*_*thi -1

尝试更改onCreateView()片段的标题。