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

时间:2013-10-16 05:36:29

标签: android android-fragments back-stack

您好我正在开发我正在使用的Android应用程序我正在使用单个Activity和3个片段。所以考虑我有3个片段AB C.当我从A切换到B时,我将Fragment添加到backstack并且将B和C添加到C.现在当我从C点击它时它显示B和B类似一个也是。

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

我想为每个Fragment实际做些什么我在ActionBar中有不同的标题。所以,在我的代码中,当我从A移动到B或B到c时,我正在更改片段内的活动标题。但是,当我点击它时,它没有根据那个改变。

实际问题是什么?为什么在从backstack弹出后我没有为onResume()调用Fragment?我该如何解决这个问题?需要帮忙。谢谢。

7 个答案:

答案 0 :(得分:18)

仅在onResume()恢复时才会调用Fragment的{​​p> 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;
}

答案 1 :(得分:13)

尝试在replace上使用add方法代替FragmentTransaction。这项工作对我来说:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();

答案 2 :(得分:2)

正如其他人已经说过的那样,onResume()仅在活动本身恢复时被调用,因此根本不会提供帮助。

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

  • 如果您replace()使用了上一个片段,那么当您返回时,将从头开始重新创建该片段,因此将再次调用onCreateView(),您可以更新工具栏标题那里。你可能已经做过了。

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

答案 3 :(得分:1)

将此代码放入您的片段中。

@Override
public void setUserVisibleHint(boolean visible) {
        super.setUserVisibleHint(visible);
        if (visible && isResumed()) {
            onResume();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!getUserVisibleHint()) {
            return;
        }
        setData();
    }

答案 4 :(得分:1)

您可以使用这种片段方法:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}

答案 5 :(得分:0)

我使用这种方式,在您的片段中添加此阻止代码

requireActivity().supportFragmentManager.addOnBackStackChangedListener {
            val fm = requireActivity().supportFragmentManager
            fm?.let {
                if (it.backStackEntryCount == YOUR_FRAGMENT_BACK_STACK_INDEX) {
                    // your fragment visible
                }
            }
        }

答案 6 :(得分:-1)

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