为什么使用FragmentTransaction add()方法在每个片段中调用onCreateOptionsMenu()?

时间:2016-10-11 10:16:09

标签: android android-fragments

我一直试图解决这个问题,并且必须误解片段在这里如何工作,尽管阅读量很大,或者我遇到了一个错误。

我有一项活动,其中包含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

1 个答案:

答案 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,并且每次添加具有菜单的片段时都会调用它。