首先让我解释一下我的应用流程。
我的MainActivity
延伸了DrawerActivity
。此DrawerActivity
负责管理两个drawers
。一个在左边,一个在右边。
MainActivity
使用
getSupportFragmentManager().beginTransaction()
.add(R.id.activity_base_container, initialFragment, initialFragment.getClass().getSimpleName())
.commit();
在initialFragment
中,向用户显示一些按钮。其中一个是显示地图的片段。如果用户按下按钮,我执行此操作:
FragmentManager fragmentManager = getFragmentManager();
FragmentMap fragment = (FragmentMap) getFragmentManager().findFragmentByTag(FragmentMap.class.getSimpleName());
if (fragment == null) {
fragment = FragmentMap.newInstance();
fragmentManager.beginTransaction()
.replace(R.id.activity_base_container, fragment)
.addToBackStack(fragment.getClass().getSimpleName())
.commit();
}
FragmentRightDrawer fragmentRightDrawer =
(FragmentRightDrawer) getFragmentManager().findFragmentByTag(FragmentRightDrawer.class.getSimpleName());
if (fragmentRightDrawer == null) {
fragmentRightDrawer = FragmentRightDrawer.newInstance(fragment);
}
((DrawerActivity) getActivity()).enableRightDrawer(fragmentRightDrawer);
当地图在屏幕上可见时,用户可以打开右侧抽屉,按下按钮并在地图上绘制标记。在抽屉时间,抽屉关闭。
如您所见,默认情况下禁用右侧抽屉,必须启用右侧抽屉。在FragmentRightDrawer.newInstance(fragment);
我通过地图回调,以便当用户按下右侧抽屉中的按钮时我可以收到该事件。由于右抽屉实际上是带有按钮列表的回收者视图,我还将此地图回调传递给了recyclerview适配器。
在我的FragmentMap
我有方法setMarker(int buttonID);
,它会收到用户点击的按钮的ID。
适配器将调用mMapListener.setMarker(buttonID);
这是按预期工作的。问题是当我旋转屏幕时。地图将重新创建并在屏幕中可见。右抽屉也重新创建,我可以打开它。问题是当我点击按钮。然后我得到java.lang.IllegalStateException: Fragment FragmentMap{425e92b0} not attached to Activity
。
我相信这种情况正在发生,因为mMapListener
回调引用了一个" old" FragmentMap
。
最好的办法是什么?