先上图
该界面通过操作 闹钟点击 设置闹钟弹出来的对话框,
点击操作是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>
在次确定了就是该两个布局文件。