即使在调用dismiss()之后,DialogFragment也会将数据保存在内存中

时间:2013-06-09 08:54:40

标签: android android-fragments android-dialogfragment

我在这里有一种非常奇怪的行为。在我的MainActivity课程中,我调用了DialogFragment

EndRoundDialogFragment df = new EndRoundDialogFragment(myVO);
df.show(fragmentManager, "end_round_dialog_fragment");

此DialogFragment的构造函数很简单:

public EndRoundDialogFragment(UserVO vo) {
    this.userVO = vo;
}

此片段中包含Google地图片段。所以我基本上做的是:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.end_round_dialog, container, false);

    mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map_result)).getMap();
    mMap.setIndoorEnabled(false);
    mMap.setMyLocationEnabled(false);
    mMap.setTrafficEnabled(false);

    buttonClose.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mListener.onEndDialogClosed();
            userVO = null;
            dismissAllowingStateLoss();
        }
    });

//Rest of the code is manipulating Markers in this map.

因此,当用户点击“关闭”按钮时,我会关闭该对话框并且状态正常。我甚至将VO设置为null。

如您所见,我的Activity实现了Dialog的Listener onEndDialogClosed()。此方法实现是:

@Override
public void onEndDialogClosed() {
    Fragment prev = fragmentManager.findFragmentByTag("end_round_dialog_fragment");
    if(prev != null)
        fragmentManager.beginTransaction().remove(prev).commit();
    new Get5PointsTask().execute();
}

所以我也在关闭时删除整个片段。

我还在此DialogFragments中添加了以下内容,以确保Google Maps片段确实已从代码中删除:

@Override
public void onDestroyView() {
    super.onDestroyView();
    Fragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map_result);
    if (f != null) {
        getFragmentManager().beginTransaction().remove(f).commit();
    }
}

在调试时,我确认变量f不为空,并且确实调用了remove()代码。

当我再次使用新的VO数据实例化DialogFragment时,Google地图会显示新旧数据。它只是没有重置de memory ......

有什么想法吗?

编辑1:

我发现了问题所在。根本没有在活动的onEndDialogClosed()方法中删除我的VO。愚蠢的我。

感谢所有人,并希望此代码可以帮助其他人。

1 个答案:

答案 0 :(得分:0)

所以,我解决了这个问题。 我只是没有重新实例化在Activity中保存用户数据的VO ...所以当打开DialogFragment时,它保留了新的和旧的。很简单,像那样愚蠢。

谢谢!