2014-11-06 39 views
1

我想在一个Activity中多次弹出一个timepicker和一个datepicker。Android DialogFragment:我可以重新使用,还是必须重新使用另一个?

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

而我很困惑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

我认为这些类是从gitHub中弹出的,在Google搜索顶部弹出的类。

它们扩展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

因此,他们不是被解雇,因为他们将通过调用底层的背景和取得的片段经理本身自动自己卸装后可重复使用。而是创建一个新实例并显示它们,或者您可以尝试覆盖其默认行为。你可以尝试改变他们被解雇后的行为,或者阻止他们被解雇(比如隐藏他们)。

相关问题