我一直试图解决这个问题,并且必须误解片段在这里如何工作,尽管阅读量很大,或者我遇到了一个错误。
我有一项活动,其中包含FrameLayout
。
创建活动后,我添加FragmentA
。
if (savedInstanceState == null) {
Fragment newFragment = FragmentA.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, newFragment, FRAGMENT_A_TAG).commit();
}
FragmentA
的{{1}}方法就像我期望的那样被调用(虽然奇怪地onCreateOptionsMenu
第一次被调用两次?)。
onPrepareOptionsMenu
创建自己的菜单,在这种情况下只是一个简单的菜单项。按下菜单项时,会将事件触发回活动以创建FragmentA
。
FragmentB
现在问题就在于此。在这个阶段,我希望只能调用 Fragment newFragment = FragmentB.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, newFragment, FRAGMENT_B_TAG);
ft.addToBackStack(null);
ft.commit();
个FragmentB
。但事实并非如此。调用onCreateOptionsMenu
的{{1}},然后调用FragmentA
。
主要活动不有任何关联菜单,只有片段。
为什么会这样?
如果我使用onCreateOptionsMenu
,我就没有这个问题。但这意味着每次弹出FragmentB时都会重新创建视图,而我正试图避免这种情况。
我希望这已经足够了,但是为了清晰起见,这里是活动的代码和两个片段。
FragmentB
答案 0 :(得分:2)
如果你打电话:
ft.add(R.id.container, fragmentA, "tag").addToBackStack(null).commit();
FragmentA将继续"恢复" ,其菜单将被"膨胀"。然后,如果你打电话:
ft.add(R.id.container, fragmentB, "tag").addToBackStack(null).commit();
FragmentA仍然"恢复" 现在FragmentB也处于状态"恢复" ,其菜单也将是& #34;充气"
当您需要更新视图时,您应该使用view.invalidate(),此方法将重新绘制"观点。
这样说......
如果您的MainActivity有一个菜单,它将调用invalidateOptionsMenu()来重绘MainActivity的菜单,并绘制FragmentA的菜单。添加FragmentB后,工具栏需要添加其菜单,因此它将调用invalidateOptionsMenu()来重绘MainActivity和FragmentA菜单,并绘制FragmentB的菜单。这就是每次更改片段时调用它的原因,因为菜单视图需要重新绘制。
如果您使用
,则不会发生这种情况ft.replace(...)
因为第一个片段将被销毁。
希望它有助于理解。
记录您的MainActivity on onCreateOptionsMenu,并且每次添加具有菜单的片段时都会调用它。