【问题标题】:Which method is called when returning to a replaced fragment in a tablayout via calling popBackStackImmediate通过调用 popBackStackImmediate 返回到 tablayout 中的替换片段时调用哪个方法
【发布时间】:2021-01-21 14:29:01
【问题描述】:

好的,我发现我正在打开/替换另一个布局元素中的片段,而不是 tablayout 所在的那个。因此,如果我理解正确并且没有触发生命周期方法,则底层片段永远不会真正离开。

我在 TabLayout 中有 FragmentA,我从中调用:

//inside FragmentA
@Override
public void onClickView() {
    activity.replaceFragment(FragmentB.newInstance(), true);
}

在replaceFragment中将传入的fragment添加到事务中的backstack中,然后替换fragment

public void replaceFragment(Fragment fragment, boolean doAddToBackStack) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    if (doAddToBackStack) {
        String tag = fragment.getClass().toString();
        ft.addToBackStack(tag);
    }

    ft.replace(R.id.mainFragment, fragment);
    ft.commit();
}

之后,FragmentB 打开,我做我的事情并通过 popBackStackImmediate() 返回到 FragmentA:

//inside FragmentB
@Override
public void onClickBack() {
    activity.getSupportFragmentManager().popBackStackImmediate();
}

当我回去时,我需要更新 FragmentA 中的一些内容。

根据平台上的another post,返回片段时应该调用 onCreateView() ,但这对我不起作用。根据fragment lifecycle documentation,仅在第一次绘制 UI 时才调用 onCreateView(),这可以解释我的麻烦。

我现在的问题是我可以使用什么生命周期方法,或者当从后台堆栈返回片段时我应该采取什么其他方法来执行代码?

【问题讨论】:

  • 您的replaceFragment 代码实际上是做什么的?
  • @ianhanniballake 我用 replaceFragment 信息更新了帖子

标签: android android-fragments android-lifecycle


【解决方案1】:

根据以下答案,您可以添加一个侦听器来检查它何时被调用 https://stackoverflow.com/a/52646588/6468214

getSupportFragmentManager().addOnBackStackChangedListener(
            new FragmentManager.OnBackStackChangedListener() {
                public void onBackStackChanged() {

                       // Your Code Here

                }
            });

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2012-03-31
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多