实现效果:
PreferenceScreen布局
preference.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/preference_item"
android:padding="10dp">
.
.
<!--xxx包名-->
<xx.xxx.xxx.TimePickerPreference
android:title="@string/wallpaper_refresh_interval"
android:key="wallpaper_refresh_interval"
android:summary="@string/description_set_interval" /> .
.
.
</PreferenceScreen>
注意指定android:dialogLayout="@layout/dialog_time_picker"
,更改弹出dialog布局
android:key="wallpaper_refresh_interval"/
3.dialog弹出布局
dialog_time_picker.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radial_time_picker"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"/>
<TimePicker
android:id="@+id/time_picker"
android:timePickerMode="spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
注意:<TextView android:id="@android:id/title"
这里textview为标题栏,必须指定id为@android:id/title
android:timePickerMode="spinner"
为选取方式
4.TimePickerPreference 继承DialogPreference :
public class TimePickerPreference extends DialogPreference {
public TimePickerPreference(Context context) {
super(context);
}
public TimePickerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public TimePickerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public TimePickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected View onCreateDialogView() {
setDialogLayoutResource(R.layout.dialog_time_picker);
setDialogTitle(R.string.select_refresh_interval);
return super.onCreateDialogView();
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
// Dialog dialog = getDialog();
timePicker = (view.findViewById(R.id.time_picker));
timePicker.setIs24HourView(true);
timePicker.setDrawingCacheEnabled(true);
String[] s = SettingHelper.getIntervalStr().split(":");//old
timePicker.setCurrentHour(Integer.parseInt(s[0]));//
timePicker.setCurrentMinute(Integer.parseInt(s[1]));
}
private TimePicker timePicker;
@Override
public void onClick(DialogInterface dialogInterface, int which) {
switch (which) {
case Dialog.BUTTON_POSITIVE:
//OK
String intervalStr = timePicker.getCurrentHour() + ":" +
timePicker.getCurrentMinute();
//LogHelper.d(intervalStr);
long interval = Utils.interval2Mills(intervalStr);
if (interval < 0) {
//MyApplication.getApplication().getSettingsActivity().showSnack(R.string.time_format_error);
} else {
SettingHelper.setInterval(intervalStr);
new AlarmHelper(MyApplication.getApplication().getSettingsActivity()).startAlarmForActivityWithInterval(
AlarmActivity.ACTION_ALARM_SET_WALLPAPER, interval,
AlarmHelper.REQUEST_CODE_ALARM_SET_WALLPAPER);
//MyApplication.getApplication().getSettingsActivity().showSnack(R.string.update_setting);
this.setSummary(intervalStr);
}
LogHelper.d("点击OK");
//dialog.dismiss();//关闭,不再触发onPreferenceChange
break;
case Dialog.BUTTON_NEGATIVE:
//do something
break;
case Dialog.BUTTON_NEUTRAL:
//dosomething
break;
}
super.onClick(dialogInterface, which);
}
@Override
protected View onCreateView(ViewGroup parent) {
return super.onCreateView(parent);
}
}
划重点:
final Dialog dialog = ((EditTextPreference) preference).getDialog();
final TimePicker timePicker = (dialog.findViewById(R.id.time_picker));
timePicker.setIs24HourView(true);//设置24小时制
注:
timePicker有:
timePicker.setCurrentHour(...);
timePicker.setCurrentMinute(...);
String time= timePicker.getCurrentHour() + ":"+timePicker.getCurrentMinute();
同时有
timePicker.setHour(...);
timePicker.setMinute(...);
timePicker.getHout();
timePicker.getMinute();
但这些需要在sdk>=23下才可使用
否则会报
Call requires API level 23 (current min is 21): android.widget.TimePicker#getMinute
Call requires API level 23 (current min is 21): android.widget.TimePicker#getHour
.
.
.