2014-01-10 100 views
2

我有1 Activity显示1个DialogFragment我使用setAlwaysFinish应用程序强制Activity在onPause后被杀死。活动死亡后恢复多个DialogFragment

暂停&恢复活动后,我有时得到或示出的相同的DialogFragment 3 。有人知道如何防止这种情况吗?

注意:我离开活动时仍显示对话框。经过多次尝试setAlwaysFinish之后,这个bug就暴露出来了。

代码:活动

package com.example.testdialog; 
import java.util.Calendar; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.view.View; 

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void showDialog(View v) { 
     Calendar today = Calendar.getInstance(); 
     DialogFragment d = DateDialog.newInstance(today.get(Calendar.DAY_OF_MONTH), today.get(Calendar.MONTH), today.get(Calendar.YEAR)); 
     d.show(getSupportFragmentManager(), "mydialog"); 
    } 
} 

代码:DialogFragment

package com.example.testdialog; 
import android.app.DatePickerDialog; 
import android.app.DatePickerDialog.OnDateSetListener; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.widget.DatePicker; 

public class DateDialog extends DialogFragment implements OnDateSetListener { 
    public static final String TAG = "datepicker"; 
    public static final int SEARCH_FLIGHT = 0; 
    public static final int PASSENGER = 1; 

    static DateDialog newInstance(int day, int month, int year) { 
     DateDialog d = new DateDialog(); 
     Bundle bun = new Bundle(); 
     bun.putInt("day", day); 
     bun.putInt("month", month); 
     bun.putInt("year", year); 
     d.setArguments(bun); 
     return d; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Bundle bun = getArguments(); 
     int year = bun.getInt("year"); 
     int month = bun.getInt("month"); 
     int day = bun.getInt("day"); 

     DatePickerDialog d = new DatePickerDialog(getActivity(), this, year, month, day); 
     d.setButton(DialogInterface.BUTTON_POSITIVE, "OK", d); 
     d.setTitle("my dialog"); 
     return d; 
    } 

    @Override 
    public void onDestroyView() { 
     Dialog d = getDialog(); 
     if (d != null && getRetainInstance()) 
      d.setDismissMessage(null); 
     super.onDestroyView(); 
    } 
} 
+0

你能否提供你的代码? – FxRi4

+0

这是真正的标准代码,我已经更新了我的问题 – Zyoo

回答

0

当你关闭对话框,关闭它正确地调用

dialog.dismiss(); 
    dialog.cancel(); 
+0

我没有关闭对话框。我仍然显示对话框离开了活动。 – Zyoo

+0

好的,然后将这些设置添加到清单文件中的活动android:configChanges =“orientation | keyboard” android:launchMode =“singleTask” –

1

我有同样的问题,不知道真正的解决办法,但这种方式可以帮助你

private void showLostPassDialog() { 
    if (!dialogShown) { 
     dialogShown = true; 
     DialogFragment newFragment = new LostPassDialogFragment(); 
     newFragment.setCancelable(false); 
     newFragment.show(getSupportFragmentManager(), "dialog"); 
    } 
} 

,并在销毁对话框中设置dialogShown=false像我一样:

public static class LostPassDialogFragment extends SherlockDialogFragment { 
    .... 
    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     dialogShown = false; 
     super.onDestroy(); 

    } 

希望能

2

您可以在您的dialogfragment使用此prefent有用:

@Override 
public void show(FragmentManager manager, String tag) { 
    if (tag != null && tag.equals("FRAGMENT_TAG_MAX_ONE_INSTANCE")) { 
     // we do not show it twice 
     if (manager.findFragmentByTag(tag) == null) { 
      super.show(manager, tag); 
     } 
    } else { 
     super.show(manager, tag); 
    } 
} 

并改变:

d.show(getSupportFragmentManager(), "FRAGMENT_TAG_MAX_ONE_INSTANCE");