【发布时间】:2016-05-25 09:33:20
【问题描述】:
我有一个令人沮丧的问题,我使用支持库为 Android 创建了一个自定义首选项。
public class CustomTimePreference extends DialogPreference {
public int hour = 0;
public int minute = 0;
public CustomTimePreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public static int parseHour(String value) {
try {
String[] time = value.split(":");
return (Integer.parseInt(time[0]));
} catch (Exception e) {
return 0;
}
}
public static int parseMinute(String value) {
try {
String[] time = value.split(":");
return (Integer.parseInt(time[1]));
} catch (Exception e) {
return 0;
}
}
public static String timeToString(int h, int m) {
return String.format("%02d", h) + ":" + String.format("%02d", m);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getString(index);
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
String value;
if (restoreValue) {
if (defaultValue == null) value = getPersistedString("00:00");
else value = getPersistedString(defaultValue.toString());
} else {
value = defaultValue.toString();
}
hour = parseHour(value);
minute = parseMinute(value);
}
public void persistStringValue(String value) {
persistString(value);
}
}
和
public class CustomTimePreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat implements DialogPreference.TargetFragment {
TimePicker timePicker = null;
@Override
protected View onCreateDialogView(Context context) {
timePicker = new TimePicker(context);
return (timePicker);
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
timePicker.setIs24HourView(true);
CustomTimePreference pref = (CustomTimePreference) getPreference();
timePicker.setCurrentHour(pref.hour);
timePicker.setCurrentMinute(pref.minute);
}
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
CustomTimePreference pref = (CustomTimePreference) getPreference();
pref.hour = timePicker.getCurrentHour();
pref.minute = timePicker.getCurrentMinute();
String value = CustomTimePreference.timeToString(pref.hour, pref.minute);
if (pref.callChangeListener(value)) pref.persistStringValue(value);
}
}
@Override
public Preference findPreference(CharSequence charSequence) {
return getPreference();
}
}
为了完整起见,preferences.xml 中包含的 xml 是:
<customcontrols.CustomTimePreference
android:key="time_pace_preference"
android:title="@string/title_time_pace_preference"
android:defaultValue="@string/settings_default_pace"
android:summary="Set some time"
/>
但是,当我尝试调用时
PreferenceManager.setDefaultValues(mContext, preferences, true);
我收到
java.lang.ClassCastException: customcontrols.CustomTimePreference cannot be cast to android.preference.Preference
为什么会这样?由于 CustomTimePreference 扩展了 DialogPreference 本身扩展了 Preference,这应该没问题?!
如果我不调用 setDefaultValues(),我可以进入我的设置片段并查看自定义控件吗?
我做错了什么,我该如何解决!?
【问题讨论】:
-
PreferenceManager.setDefaultValues(mContext, preferences, true);在这一行中,preferences变量是什么?我在代码中的任何地方都没有看到它。 -
在应用程序初始化期间,preferences int 变量从活动传递到我的引擎(这是一个 lib 项目),如下所示:
initialisedSDK = engine.initialise(this, this, R.xml.preferences);然后此方法签名为:public boolean initialise(Context mContext, engine callback, int preferences)I应该在新的自定义类之前添加这个工作正常,我不知道它是否与支持库有关?
标签: android casting classcastexception preference