Android DialogFragment:我可以重复使用,还是我必须新建另一个?

时间:2014-11-06 01:19:38

标签: android android-fragments

我想在一个Activity中不止一次弹出一个timepicker和一个datepicker。

我不清楚是否应该为每个实例创建一个实例,并根据需要显示它们,或者每次我需要弹出对话框时是否应该创建新实例。

我对findFragmentByTag / findFragmentById非常困惑。看来片段只有在当前显示的情况下才能找到?

但如果找不到它并且我创建了一个新的Fragment并用相同的标签显示它,我会得到一个IllegalStateException。如何在onCreate中恢复片段?

目前,我正在这样做:

FragmentManager fm = getSupportFragmentManager();

if (savedInstanceState == null) {
    timePicker = new RadialTimePickerDialog();
    datePicker = new CalendarDatePickerDialog();
    fm.beginTransaction().add(timePicker, FRAGMENT_TIME_PICKER)
        .add(datePicker, FRAGMENT_DATE_PICKER).commit();
} else {
    timePicker = (RadialTimePickerDialog)  
        fm.findFragmentByTag(MedicationCollapsePanel.FRAGMENT_TIME_PICKER);
    datePicker = (CalendarDatePickerDialog) 
        fm.findFragmentByTag(MedicationCollapsePanel.FRAGMENT_DATE_PICKER);
}

正如我所提到的,这实际上找不到碎片,几乎同样糟糕,它在活动开始时立即显示,我不想要。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为这些类是来自谷歌搜索顶部弹出的gitHub的同名名称。

他们扩展了dialogFragments。

DialogFragments负责在解散时使用片段管理器删除自己。您可以通过以下链接查看源代码并获取此解密:

关闭():

  

关闭片段及其对话框。如果片段被添加到   返回堆栈,所有后向堆栈状态直到并包括此条目   被弹出。否则,将提交一个新事务以删除   片段。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/app/DialogFragment.java#DialogFragment.onDismiss%28android.content.DialogInterface%29

因此,它们在被解雇后不可重用,因为它们将通过调用底层上下文并自己获取片段管理器来自动取消附加。而是创建一个新实例并显示它们,或者您可以尝试覆盖它们的默认行为。您可以尝试更改他们在被解雇后所做的事情,或者首先防止他们被解雇(例如隐藏他们)。