《Android编程权威指南(第三版)》第十二章挑战练习Demo上
因为第十二章有两个挑战练习,所以分成上下来发,先说第一个,题目要求在CrimeFragment中加一个按钮显示TimePickerFragment视图界面,当然,只显示肯定很简单,但我们可以自己加点难度,就像日期按钮一样,在点开日历之后选择日期返回后也可以更改CrimeFragment里面的数值,比如:
可以看到在recyclerview里面的时间原本是16:39,最后更改为了21:00,实现原理和书上实现日期更改代码相同,最好自己跟着在写一遍,加深印象,我就放一下更改过的代码和添加的代码:
CrimeFragment.java:
/** * 这里其实和上面的日期按钮差不多的,就不过多赘述了 */ updateTime(); mTimeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FragmentManager fragmentManager = getFragmentManager(); TimePickerFragment dialog = TimePickerFragment.newInstance(mCrime.getDate()); dialog.setTargetFragment(CrimeFragment.this, REQUEST_TIME); dialog.show(fragmentManager, DIALOG_TIME); } });
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } /** * 更改了一下书上的代码,用switch语句来进行选择 */ switch (requestCode) { case REQUEST_DATE: Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE); mCrime.setDate(date); updateDate(); break; case REQUEST_TIME: Date date1 = (Date) data.getSerializableExtra(TimePickerFragment.EXTRA_TIME); mCrime.setDate(date1); updateTime(); default: break; } }
TimePickerFragment.java:(这一块和DatePickerFragment差不多,有些许地方不太一样)
public class TimePickerFragment extends DialogFragment { public static final String EXTRA_TIME = "com.bignerdranch.android.criminalintent.time"; private static final String ARG_TIME = "time"; private TimePicker mTimePicker; public static TimePickerFragment newInstance(Date date) { Bundle args = new Bundle(); args.putSerializable(ARG_TIME, date); TimePickerFragment fragment = new TimePickerFragment(); fragment.setArguments(args); return fragment; } @RequiresApi(api = Build.VERSION_CODES.M) @Override public Dialog onCreateDialog(Bundle savedInstanceStance) { Date date = (Date) getArguments().getSerializable(ARG_TIME); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int hours = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_time, null); mTimePicker = (TimePicker) view.findViewById(R.id.dialog_time_picker); mTimePicker.setHour(hours); mTimePicker.setMinute(minute); return new AlertDialog.Builder(getActivity()) .setView(view) .setTitle(R.string.time_picker_title) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int hour = mTimePicker.getHour(); int minute = mTimePicker.getMinute(); Date date = new GregorianCalendar(0, 0, 0, hour, minute).getTime(); sendResult(Activity.RESULT_OK, date); } }) .create(); } private void sendResult(int resultCode, Date date) { if (getTargetFragment() == null) { return; } Intent intent = new Intent(); intent.putExtra(EXTRA_TIME, date); getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent); } }
注意,Date的getHour等方法已经过时,可以使用calendar.get(Calendar.HOUR_OF_DAY)来获得小时数
源码地址:Demo
许久没写:特来注明,最近事情较多,会马上开始补上