挑战练习1 更多对话框
和 DatePickerFragment 几乎完全一样。
挑战练习2 实现响应式 DialogFragment
第一、二步就按提示完成。
1 | // dialog_date.xml |
1 | // DatePickerFragment.java |
1 | // DatePickerActivity.java |
1 | // CrimeFragment.java |
第三步 涉及 第17章
按17章的步骤修改代码,不考虑新建Crime和数据库部分,可使 CrimeList 和 Crime明细 在平板上显示在屏幕两侧。
但是第二步把 DatePicker 托管到 Activity 了,现在启动DatePicker 都是打开一个 Activity 充满屏幕,所以改成判断设备是手机还是平板,决定启动 DatePickerFragment 的方式:
1 | // CrimeFragment.java |
现在在平板上就会显示对话框了,但是按 DatePicker 的OK按钮后,CrimeFragment 的日期却不更新。
通过 Logcat 发现,sendResult() 里发送的就是原来的date,怎么回事呢?
之前自己为了方便,实现第二步的时候,用新建 Activity 的方式启动 DatePicker 这个页面,我直接把 onCreateDialog() 里的代码 copy 到了 onCreateView() 里,只改动了 这里:
1 | // DatePickerFragment.java -- onCreateView() |
而在onCreateDialog里的是:
1 | // DatePickerFragment.java -- onCreateDialog() |
通过在生命周期函数里打 log 发现如下生命周期调用顺序:
平板
手机
onCreateView() 在两种方式启动时都会调用,而手机启动 Activity时不会调用 onCreateDialog() 方法。
所以在平板上没返回修改后的 date 应该是mDatePicker init了两次导致的,所以在 onCreateView() 里做一个判断,如果 mDatePicker不为空的话,再对其进行 findViewById 和 init:
1 | // DatePickerFragment.java |
最终效果:
平板设备显示对话框
手机设备显示全屏 Activity