我对使用支持v7或v14库的Android偏好设置感到困惑。 似乎每隔几个月Google就会更改API。
我正在尝试创建时间偏好对话框。但是,我目前的工作不适用于支持库。
public class TimePickerPreference : DialogPreference
{
private int lastHour = 0;
private int lastMinute = 0;
private TimePicker picker = null;
public static int GetHour(string time)
{
string[] pieces = time.Split(':');
return Convert.ToInt32(pieces[0]);
}
public static int GetMinute(string time)
{
string[] pieces = time.Split(':');
return Convert.ToInt32(pieces[1]);
}
public TimePickerPreference(Context ctxt, IAttributeSet attrs) : base(ctxt, attrs)
{
}
protected override View OnCreateDialogView()
{
picker = new TimePicker(Context);
picker.SetIs24HourView(Java.Lang.Boolean.True);
return picker;
}
protected override void OnBindDialogView(View v)
{
base.OnBindDialogView(v);
picker.Hour = lastHour;
picker.Minute = lastMinute;
}
protected override void OnDialogClosed(bool positiveResult)
{
base.OnDialogClosed(positiveResult);
if (positiveResult)
{
lastHour = picker.Hour;
lastMinute = picker.Minute;
string time = lastHour + ":" + lastMinute;
if (lastMinute.ToString().Length == 1)
time = lastHour + ":" + "0" + lastMinute;
if (CallChangeListener(time))
{
PersistString(time);
}
Title = "שעת תזכורת: " + time;
}
}
protected override Java.Lang.Object OnGetDefaultValue(TypedArray a, int index)
{
return a.GetString(index);
}
protected override void OnSetInitialValue(bool restorePersistedValue, Java.Lang.Object defaultValue)
{
string time = string.Empty;
if (restorePersistedValue)
{
if (defaultValue == null)
{
time = GetPersistedString("00:00");
}
else
{
time = GetPersistedString(defaultValue.ToString());
}
}
else
{
time = defaultValue.ToString();
}
lastHour = GetHour(time);
lastMinute = GetMinute(time);
}
}
DialogPreference
在支持库中不存在,而且似乎是PreferenceDialogFragment
或PreferenceDialogFragmentCompat
,两者的工作方式不同,上面的代码没有& #39;与他们合作。
我真的对此感到茫然,并且很乐意提供一些帮助。
谢谢!
答案 0 :(得分:0)
支持库是:
Android支持库提供了许多未内置于框架中的功能。这些库提供向后兼容的新功能版本,提供框架中未包含的有用UI元素,并提供应用程序可以使用的一系列实用程序 https://developer.android.com/topic/libraries/support-library/index.html#overview
如果您使用支持库,则必须添加到项目中,但如果使用DialogPreference
中存在的API level 1
,您的应用将在每个Android设备中运行。
除非需要某些目标sdk中没有的功能,否则您不需要使用支持库。
我必须使用女巫的支持吗?关于女巫的特征和你需要的最小sdk:v4支持库
此库旨在与Android 1.6(API级别4)及更高版本一起使用。它包括与其他库相比最大的API集,包括对应用程序组件,用户界面功能,可访问性,数据处理,网络连接和编程实用程序的支持。
v7图书馆
有几个库设计用于Android 2.1(API级别7)及更高版本。这些库提供特定的功能集,可以彼此独立地包含在您的应用程序中。
v7 appcompat库
此库添加了对Action Bar用户界面设计模式的支持。
注意:此库取决于v4支持库。如果您使用的是Ant或Eclipse,请确保将v4支持库包含在此库的类路径中。
v13支持库
此库旨在用于Android 3.2(API级别13)及更高版本。它使用(FragmentCompat)类和其他片段支持类
添加了对Fragment用户界面模式的支持
https://developer.android.com/topic/libraries/support-library/features.html
答案 1 :(得分:0)
您需要通过支持库实现以下几点:
时间选择器的布局:
<!-- Layout for the TimePreference Dialog -->
<TimePicker
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/time_picker"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="18dp"
android:paddingTop="18dp" />
用于读取/写入时间首选项的首选项类:
import android.support.v7.preference.DialogPreference;
public class TimePreference extends DialogPreference {
private String time;
public TimePreference(Context context) {
// Delegate to other constructor
this(context, null);
}
public TimePreference(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.preferenceStyle);
}
public TimePreference(Context context, AttributeSet attrs, int defStyleAttr) {
// Delegate to other constructor
this(context, attrs, defStyleAttr, defStyleAttr);
}
public TimePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setPositiveButtonText(R.string.set_value);
setNegativeButtonText(R.string.cancel);
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
// save to SharedPreference
persistString(time);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getString(index);
}
@Override
public int getDialogLayoutResource() {
return R.layout.pref_dialog_time;
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
setTime(restorePersistedValue ?
getPersistedString(time) : (String) defaultValue);
}
public static int getHour(String time) {
String[] pieces = time.split(":");
return Integer.parseInt(pieces[0]);
}
public static int getMinute(String time) {
String[] pieces = time.split(":");
return Integer.parseInt(pieces[1]);
}
}
一个dialogFragment,它控制您的时间选择器的显示:
public class TimePreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
private TimePicker mTimePicker;
public static TimePreferenceDialogFragmentCompat newInstance(String key) {
final TimePreferenceDialogFragmentCompat
fragment = new TimePreferenceDialogFragmentCompat();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
mTimePicker = view.findViewById(R.id.time_picker);
if (mTimePicker == null) {
throw new IllegalStateException("Dialog view must contain a TimePicker with id 'time_picker'");
}
String time = null;
DialogPreference preference = getPreference();
if (preference instanceof TimePreference) {
time = ((TimePreference) preference).getTime();
}
// Set the time to the TimePicker
if (time != null) {
mTimePicker.setIs24HourView(DateFormat.is24HourFormat(getContext()));
mTimePicker.setCurrentHour(TimePreference.getHour(time));
mTimePicker.setCurrentMinute(TimePreference.getMinute(time));
}
}
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
// Get the current values from the TimePicker
int hour = mTimePicker.getCurrentHour();
int minute = mTimePicker.getCurrentMinute();
// Generate value to save
String time = hour + ":" + minute;
DialogPreference preference = getPreference();
if (preference instanceof TimePreference) {
TimePreference timePreference = ((TimePreference) preference);
if (timePreference.callChangeListener(time)) {
timePreference.setTime(time);
}
}
}
}
}
最后,您需要一个自定义的PreferenceFragmentCompat:
public class MyPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onDisplayPreferenceDialog(Preference preference) {
DialogFragment dialogFragment = null;
if (preference instanceof TimePreference) {
dialogFragment = TimePreferenceDialogFragmentCompat.newInstance(preference.getKey());
}
if (dialogFragment != null) {
dialogFragment.setTargetFragment(this, 0);
dialogFragment.show(this.getFragmentManager(), "android.support.v7.preference" +
".PreferenceFragment.DIALOG");
} else {
super.onDisplayPreferenceDialog(preference);
}
}
}
如果没有支持库,似乎容易得多:-/