先上图
该界面通过操作 闹钟点击 设置闹钟弹出来的对话框,
点击操作是AlarmTimeClickHandler.java 中onClockClicked方法:
public void onClockClicked(Alarm alarm) { mSelectedAlarm = alarm; //wanlihua TimePickerCompat.showTimeEditDialog(mFragment, alarm, DateFormat.is24HourFormat(mFragment.getActivity())); }
找到 TimePickerCompat.java showTimeEditDialog实现方法:
public static void showTimeEditDialog(Fragment targetFragment, Alarm alarm, boolean use24hourFormat) { // Make sure the dialog isn't already added. final FragmentManager manager = targetFragment.getFragmentManager(); final FragmentTransaction ft = manager.beginTransaction(); final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER); if (prev != null) { ft.remove(prev); } /// M: Avoid exception ft.commitAllowingStateLoss(); if (Utils.isLOrLater()) { final TimePickerPostL picker = new TimePickerPostL(); picker.setTargetFragment(targetFragment, 0); picker.setOnTimeSetListener((OnTimeSetListener) targetFragment); picker.setAlarm(alarm); picker.show(manager, FRAG_TAG_TIME_PICKER); android.util.Log.d("wanlihua", "wanlihua debug showTimeEditDialog"); } else { final int hour, minutes; if (alarm == null) { hour = 0; minutes = 0; } else { hour = alarm.hour; minutes = alarm.minutes; } TimerPickerPreL picker = TimerPickerPreL.newInstance(targetFragment, hour, minutes, use24hourFormat); if (!picker.isAdded()) { picker.show(manager, FRAG_TAG_TIME_PICKER); } } }
看得到是 final TimePickerPostL picker = new TimePickerPostL();
在看TimePickerPostL类的实现的,
public static class TimePickerPostL extends DialogFragment { private Alarm mAlarm; private android.app.TimePickerDialog.OnTimeSetListener mListener; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final int hour, minute; if (mAlarm == null) { final Calendar c = Calendar.getInstance(); hour = c.get(Calendar.HOUR_OF_DAY); minute = c.get(Calendar.MINUTE); } else { hour = mAlarm.hour; minute = mAlarm.minutes; } return new android.app.TimePickerDialog(getActivity(), R.style.TimePickerTheme, mListener, hour, minute, DateFormat.is24HourFormat(getActivity())); }
看到其实是framework中TimePickerDialog TimePickerDialog.java
private Alarm mAlarm;
private android.app.TimePickerDialog.OnTimeSetListener mListener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final int hour, minute;
if (mAlarm == null) {
final Calendar c = Calendar.getInstance();
hour = c.get(Calendar.HOUR_OF_DAY);
minute = c.get(Calendar.MINUTE);
} else {
hour = mAlarm.hour;
minute = mAlarm.minutes;
}
return new android.app.TimePickerDialog(getActivity(), R.style.TimePickerTheme,
mListener, hour, minute, DateFormat.is24HourFormat(getActivity()));
}
然后TimePickerDialog实现是在 framework中的TimePickerDialog.java
public TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) { super(context, resolveDialogTheme(context, themeResId)); mTimeSetListener = listener; mInitialHourOfDay = hourOfDay; mInitialMinute = minute; mIs24HourView = is24HourView; final Context themeContext = getContext(); final TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true); final LayoutInflater inflater = LayoutInflater.from(themeContext); final View view = inflater.inflate(R.layout.time_picker_dialog, null); setView(view); setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok), this); setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel), this); setButtonPanelLayoutHint(LAYOUT_HINT_SIDE); mTimePicker = (TimePicker) view.findViewById(R.id.timePicker); mTimePicker.setIs24HourView(mIs24HourView); mTimePicker.setCurrentHour(mInitialHourOfDay); mTimePicker.setCurrentMinute(mInitialMinute); mTimePicker.setOnTimeChangedListener(this); }通过 搜索
\frameworks\base\core\res\res\layouttime_picker_material.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/time_picker_header_material" android:layout_width="match_parent" android:layout_height="106dp" android:layout_gravity="center" /> <!-- @dimen/timepicker_header_height --> <android.widget.RadialTimePickerView android:id="@+id/radial_picker" android:layout_width="wrap_content" android:layout_height="@dimen/timepicker_radial_picker_dimen" android:layout_gravity="center" android:layout_marginTop="@dimen/timepicker_radial_picker_top_margin" android:layout_marginStart="@dimen/timepicker_radial_picker_horizontal_margin" android:layout_marginEnd="@dimen/timepicker_radial_picker_horizontal_margin" /> </LinearLayout>
实际调用的又是include time_picker_header_material.xml
<?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2013 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License --> <!-- This layout is duplicated in land/time_picker_material.xml, so any changes made here need to be manually copied over. --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/time_header" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingStart="16dp" android:paddingEnd="16dp"> <!-- The hour should always be to the left of the separator, regardless of the current locale's layout direction. --> <com.android.internal.widget.NumericTextView android:id="@+id/hours" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/separator" android:layout_alignBaseline="@+id/separator" android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:background="@drawable/time_picker_editable_background" android:singleLine="true" android:ellipsize="none" android:gravity="right" android:focusable="true" android:nextFocusForward="@+id/minutes" /> <TextView android:id="@+id/separator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/timepicker_separator_padding" android:layout_marginRight="@dimen/timepicker_separator_padding" android:layout_centerInParent="true" android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:importantForAccessibility="no" /> <!-- The minutes should always be to the left of the separator, regardless of the current locale's layout direction. --> <com.android.internal.widget.NumericTextView android:id="@+id/minutes" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/separator" android:layout_alignBaseline="@+id/separator" android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:background="@drawable/time_picker_editable_background" android:singleLine="true" android:ellipsize="none" android:gravity="left" android:focusable="true" android:nextFocusForward="@+id/am_label" /> <!-- The layout alignment of this view will switch between toRightOf @id/minutes and toLeftOf @id/hours depending on the locale. --> <RadioGroup android:id="@+id/ampm_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/minutes" android:layout_alignBaseline="@+id/minutes" android:paddingStart="4dp" android:paddingEnd="4dp" android:orientation="vertical" android:baselineAlignedChildIndex="1"> <RadioButton android:id="@+id/am_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="4dp" android:paddingRight="4dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:layout_marginBottom="-8dp" android:textAppearance="@style/TextAppearance.Material.TimePicker.AmPmLabel" android:lines="1" android:ellipsize="none" android:focusable="true" android:background="?android:attr/selectableItemBackground" android:includeFontPadding="false" android:nextFocusForward="@+id/pm_label" android:button="@null" /> <RadioButton android:id="@+id/pm_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="4dp" android:paddingRight="4dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:textAppearance="@style/TextAppearance.Material.TimePicker.AmPmLabel" android:lines="1" android:ellipsize="none" android:focusable="true" android:background="?android:attr/selectableItemBackground" android:includeFontPadding="false" android:button="@null" /> </RadioGroup> </RelativeLayout>在次确定了就是该两个布局文件。