《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习,bignerdranch
《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习,bignerdranch
本书第12章是讲解Dialog。12.4挑战练习是在CriminalIntent项目中,再增加一个TimePickerFragment的对话框fragment。通过在CrimeFragment用户界面上添加的时间按钮,
弹出TimePickerFragment界面,允许用户使用TimePicker组件选择crime发生的具体时间。
我的修改思路是:
具体实现如下。请各位高手拍砖。
1、使用AppCompat兼容库
依据DatePickerFragment实现方式,仍使用AppCompat兼容库。它在实现DatePickerFragment时,已经添加到CriminalIntent项目中。
2、增加、更新资源文件
2.1)增加标题:“Time of crime:”
在项目中,res\values\strings.xml增加 <string name="time_picker_title">Time of crime:</string>
即:
1 <resources> 2 ... ... 3 4 <string name="time_picker_title">Time of crime:</string> 5 </resources>
2.2)在CrimFragment界面上添加Time Button
在CrimFragment界面上显示Time Button,需要在项目中res\layout\fragment_crime.xml文件,增加下列代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 ... ... 4 5 <Button 6 ... ... 7 /> 8 9 <Button 10 android:id="@+id/crime_time" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:layout_marginLeft="16dp" 14 android:layout_marginRight="16dp" 15 /> 16 17 <CheckBox 18 ... ... 19 /> 20 21 </LinearLayout>
2.3)为了保证设备旋转后仍然能正常显示
还需在项目的res\layout-land\fragment_crime.xml文件增加类似上面代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 ... ... 4 5 <Button 6 ... ... 7 /> 8 9 <Button 10 android:id="@+id/crime_time" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:layout_weight="1"/> 14 15 <CheckBox 16 ... ... 17 /> 18 19 ... ... 20 21 </LinearLayout>
3、创建新的TimePickerFragment
TimePickerFragment是DialogFragment的子类。然后,在TimePickerFragment中,创建并配置显示TimePicker组件的AlertDialog实例。TimePickerFragment同样由CrimePagerActivity托管。
3.1)使用android.support.v4.app.DialogFragment库
创建TimePickerFragment类,并设置其超类DialogFragment,由android.support.v4.app.DialogFragment库支持。
在TimePickerFragment.java中,重载DialogFragment类的onCreateDialog(Bundle savedInstanceState)方法。由托管activity的FragmentManager会调用它,在屏幕上显示DialogFragment。
onCreateDialog(Bundle savedInstanceState)方法的实现代码,创建一个带标题栏和OK按钮的AlertDialog,代码如下。注意:导入AlertDialog时,还是选择AppCompat库中的版本:android.support.v7.app.AlertDialog。
1 public class TimePickerFragment extends DialogFragment { 2 3 @Override 4 public Dialog onCreateDialog(Bundle savedInstanceState) { 5 6 return new AlertDialog.Builder(getActivity()) 7 .setTitle(R.string.time_picker_title) 8 .setPositiveButton(android.R.string.ok, null) 9 .create(); 10 } 11 }
这里类似DatePickerFragment,使用AlerDialog.Builder类,以Fluent Interface的方式创建AlertDialog实例。
3.2)显示TimeDialogFragment
同DatePickerFragment一样,TimeDialogFragment实例也是由托管activity的FragmentManager管理。使用fragment实例的public void show(FragmentManager manager, String tag)方法,将TimePickerFragment添加给FragmentManager管理并放置到屏幕上。
在CrimeFragment(CrimeFragment.java)中,也为TimePickerFragment增加一个tag常量:
1 private static final String DIALOG_TIME = "DialogTime";
然后,在onCreateView(...)方法中,添加点击时间按钮展现TimePickerFragment界面,实现mTimeButton按钮的OnClickListener监听器接口,代码:
1 public class CrimeFragment extends Fragment { 2 3 ... ... 4 private static final String DIALOG_TIME = "DialogTime"; 5 6 ... ... 7 8 mTimeButton = (Button) v.findViewById(R.id.crime_time); 9 mTimeButton.setText(DateFormat.format("h:mm a", mCrime.getDate())); 10 mTimeButton.setOnClickListener(new View.OnClickListener() { 11 @Override 12 public void onClick(View v) { 13 FragmentManager manager = getFragmentManager(); 14 TimePickerFragment timeDialog = new TimePickerFragment(); 15 timeDialog.show(manager, DIALOG_TIME); 16 } 17 }); 18 19 ... ... 20 }
这就可以显示:带标题(Time of crime:)和OK(确定)按钮的AlertDialog。
3.3)设置对话框的显示内容
同DatePickerFragment.
这时需要在TimePirckerFragment(TimePirckerFragment.java)中,使用AlertDialog.Builder的setView(...)方法, 添加TimePicker组件给AlertDialog对话框:
1 public AlertDialog.Builder setView(View view)