您好我正在开发我正在使用的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
?我该如何解决这个问题?需要帮忙。谢谢。
答案 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()
上的标题。