【问题标题】:Android PreferenceManager.setDefaultValues() crashes with class cast exceptionAndroid PreferenceManager.setDefaultValues() 因类转换异常而崩溃
【发布时间】: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


【解决方案1】:

如果您正在扩展 android.support.v7.preference.DialogPreference,这将导致此崩溃。

如果是这样,您可以改用android.support.v7.preference.PreferenceManager#setDefaultValues(android.content.Context, int, boolean)

【讨论】:

  • @MahmoudHeretani 我记不太清了,但看起来我在说“当您使用支持首选项类时,您必须使用支持PreferenceManagersetDefaultValues 实现,您不能使用操作系统提供的PreferenceManager 的 setDefaultValues。(请注意,两个版本的软件包不同。)"
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2022-01-08
  • 2012-10-25
  • 2018-03-05
相关资源
最近更新 更多