关闭DialogFragment但对象仍在内存中

时间:2013-05-22 13:29:49

标签: android android-fragments android-dialogfragment

我有一个Activity,我有一个MenuItem,点击后会初始化以下DialogFragment

MapDialogFragment df = new MapDialogFragment();
Bundle bundle = new Bundle();
bundle.putDoubleArray("lat_log", new double[] {48.85139, 2.34798});
df.setArguments(bundle);
df.show(fragmentManager, "google_maps_dialog_fragment");

此DialogFragment中包含一个GoogleMaps <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment"

GoogleMap对象有OnMapClickListener,当用户点击它时,会向其添加标记。一切都很棒。

然后,用户点击关闭按钮,我运行以下代码:

getArguments().remove("lat_log");
dismissAllowingStateLoss();

然后关闭Dialog并使用用户输入的数据刷新我的Activity代码(通过Listener)。

当用户再次点击MenuItem并打开Dialog时,之前用户插入的每个数据仍然存在。

Dialog的代码已在onCreateView()方法中初始化。我没有实现onResume(),如果它有助于了解...

我做错了什么?

非常感谢, 菲利普

编辑1:

I have tried the following before showing the DialogFragment:
Fragment prev = fragmentManager.findFragmentByTag("google_maps_dialog_fragment");
if(prev != null) {
    fragmentManager.beginTransaction().remove(prev).commit();
}
MapDialogFragment df = new MapDialogFragment();
Bundle bundle = new Bundle();
bundle.putDoubleArray("lat_log", new double[] {48.85139, 2.34798});
df.setArguments(bundle);
df.show(fragmentManager, "google_maps_dialog_fragment");

没有效果......

有想法的人吗?

编辑2: 找到问题的根源:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null)
                parent.removeView(view);
        }
        try {
            view = inflater.inflate(R.layout.dialog, container, false);
        } catch (InflateException e) {
            /* map is already there, just return view as it is */
            System.out.println("this is not working");
        }
....

我添加了if (view != null)因为出于某些疯狂的原因,当我第二次实例化DialogFragment时,inflate方法返回null ...我不知道为什么。所以我保持对view作为类变量的引用...... 所以现在我必须找出为什么膨胀现在正在回归......

编辑4

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

你去吧。这有效!

0 个答案:

没有答案