因此,当您离开某个活动时,我已启用该设置以消除行为 设置=>开发人员选项=>不要保留活动
这应该基本上复制一个被收集的活动或片段,然后我必须通过bundle savedinstancestate恢复数据。
所以我理解它是如何工作的。但是当我从片段1导航到片段2然后将应用程序放在后台然后放在前台(破坏活动)时 片段1和片段2都同时显示。其中只应显示片段2。
我不知道这是否是我必须管理隐藏和显示片段onsavedinstance的标准。或者,如果我的代码中的某些内容破坏了。下面是我如何推送我希望有用的片段:
public void pushFragmentWithAnimation(FragmentManager fm, int parentId, Fragment currentFrag, Fragment newFrag, int animEntry, int animExit) {
hideSoftKeyboard(currentFrag.getActivity());
FragmentTransaction ft = fm.beginTransaction();
// See: http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)
ft.setCustomAnimations(animEntry, animExit, animEntry, animExit);
ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);
ft.addToBackStack(null);
ft.commit();
}
片段1仍然在后台,因为当我按下时我只看到片段1.如果你知道为什么会这样,请告诉我。
答案 0 :(得分:1)
XML添加的生命周期片段和以编程方式添加的片段相差很大,使得混合它们是个坏主意,详见here。
最简单的方法是通过使用相同ID的FrameLayout替换XML膨胀的Fragment以编程方式添加所有片段,然后在onCreate add中添加
FragmentManager fragMgr = getSupportFragmentManager();
if (null == fragMgr.findFragmentByTag(FRAG_TAG))
{
fragMgr.beginTransaction().
add(R.id.fragment, new Fragment1(), FRAG_TAG).commit();
}
FRAG_TAG
是任何唯一字符串。这样可以确保仅在Fragment1不在布局中时才会创建它。
答案 1 :(得分:0)
我不完全确定为什么这个解决方案有效。我假设它与活动被杀死有关,它不会跟踪当前显示的片段并显示所有片段。所以基本上我需要替换:
ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);
与
ft.replace(parentId, newFrag, tag);
然后当我在主要活动中创建初始片段时。
时我才会这样做if(savedInstanceState==null){
我的更新代码如下:https://github.com/CorradoDev/FragmentTest/tree/2c53f9f42e835da768f61b0233f3ab5b3adf2448