ava.lang.ClassCastException:java.lang.String无法强制转换为NumberPickerPreference中的java.lang.Integer

时间:2017-08-30 08:05:37

标签: android

public class NumberPickerPreference extends DialogPreference {

public static final int DEFAULT_MAX_VALUE = 100;
public static final int DEFAULT_MIN_VALUE = 0;
public static final boolean DEFAULT_WRAP_SELECTOR_WHEEL = true;

private final int minValue;
private final int maxValue;
private final boolean wrapSelectorWheel;

private NumberPicker picker;
private int value;

public NumberPickerPreference(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.dialogPreferenceStyle);
}

public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumberPickerPreference);
    minValue =  a.getInteger(R.styleable.NumberPickerPreference_minValue, DEFAULT_MIN_VALUE);
    maxValue = a.getInteger(R.styleable.NumberPickerPreference_maxValue, DEFAULT_MAX_VALUE);
    wrapSelectorWheel = a.getBoolean(R.styleable.NumberPickerPreference_wrapSelectorWheel, DEFAULT_WRAP_SELECTOR_WHEEL);
    a.recycle();
}

@Override
protected View onCreateDialogView() {
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.gravity = Gravity.CENTER;

    picker = new NumberPicker(getContext());
    picker.setLayoutParams(layoutParams);

    FrameLayout dialogView = new FrameLayout(getContext());
    dialogView.addView(picker);

    return dialogView;
}

@Override
protected void onBindDialogView(View view) {
    super.onBindDialogView(view);
    picker.setMinValue(minValue);
    picker.setMaxValue(maxValue);
    picker.setWrapSelectorWheel(wrapSelectorWheel);
    picker.setValue(getValue());
}

@Override
protected void onDialogClosed(boolean positiveResult) {
    if (positiveResult) {
        picker.clearFocus();
        int newValue = picker.getValue();
        if (callChangeListener(newValue)) {
            setValue(newValue);
        }
    }
}

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, minValue);
}

@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {

    setValue(restorePersistedValue ? getPersistedInt(minValue) : (Integer) defaultValue);
}

public void setValue(int value) {
    this.value = value;
    persistInt(this.value);
}

public int getValue() {
    return this.value;
}
}

这是我的偏好.xml

 <PreferenceCategory>
            <com.techjini.highlightvideo.util.NumberPickerPreference
                android:defaultValue="2"
                android:entries="@array/highlighttime"
                android:entryValues="@array/highlighttime"
                android:key="prefPastsec"
                android:summary="@string/pref_past_hightlight"
                android:title="@string/pref_past_hightlight"
                preference:maxValue="18"
                preference:minValue="35"
                preference:wrapSelectorWheel="false"

                />


            <com.techjini.highlightvideo.util.NumberPickerPreference
                android:defaultValue="2"
                android:entries="@array/highlighttime"
                android:entryValues="@array/highlighttime"
                android:key="prefFuturesec"
                android:summary="@string/pref_future_highlight"
                android:title="@string/pref_future_highlight"
                preference:maxValue="18"
                preference:minValue="35"
                preference:wrapSelectorWheel="false"
                />


        </PreferenceCategory>

我打电话给下面的片段:

public static class MyPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
            Preference preference = getPreferenceScreen().getPreference(i);
            if (preference instanceof PreferenceGroup) {
                PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
                for (int j = 0; j < preferenceGroup.getPreferenceCount(); ++j) {
                    Preference singlePref = preferenceGroup.getPreference(j);
                    updatePreference(singlePref);
                }
            } else {
                updatePreference(preference);
            }
        }
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        updatePreference(findPreference(key));
    }

    private void updatePreference(Preference preference) {
        if (preference == null)
            return;


        if (preference instanceof NumberPickerPreference) {
            NumberPickerPreference listPreference = (NumberPickerPreference) preference;
            preference.setSummary(listPreference.getValue());
            return;

        }
        if (preference instanceof EditTextPreference) {

            EditTextPreference editTextPref = (EditTextPreference) preference;
            preference.setSummary(editTextPref.getText());
        }
    }
}

对于ListPreference,它工作正常。我用NumberPickerPreference改变了同样的事情。但它没有正常工作,因为我正在

  

classcast在NumberPickerPreference.java:88中的异常行setValue(restorePersistedValue?getPersistedInt(minValue):(整数)defaultValue);

请告诉我,为什么它给出了类演员Exception。

2 个答案:

答案 0 :(得分:0)

试试这个。

  1. java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Integer

    更改

    setValue(restorePersistedValue ? getPersistedInt(minValue) : (Integer) defaultValue);
    

    int mDefaultValue = Integer.parseInt((String) defaultValue)
    setValue(restorePersistedValue ? getPersistedInt(minValue) : mDefaultValue);
    
  2. 资源$ NotFoundException:字符串资源ID

    更改

    preference.setSummary(listPreference.getValue());
    

    preference.setSummary(listPreference.getValue() +"");
    
  3. 注意

    如果值为对象,则您希望将Object value转换为int value

    你可以Integer.parseInt((String) value);

    如果您使用此tv.setText(value)进行编码,则value必须为String

    您可以使用tv.setText(value + "");tv.setText(String.valueOf(value));

    修改

    setValue(restorePersistedValue ? getPersistedInt(minValue) : (Integer) defaultValue);

    1. 确保restorePersistedValue返回boolean Data
    2. 确保getPersistedInt(minValue)返回int Data
    3. 确保defaultValue不为空且隐藏为int Data

答案 1 :(得分:0)

  

setValue(restorePersistedValue?getPersistedInt(minValue):( Integer)defaultValue);

将抛出 ClassCastException :String无法强制转换为Integer,因此请确保在两个参数中使用相同的返回类型,如:

setValue(restorePersistedValue ? getPersistedInt(minValue) : Integer.parseInt(defaultValue));

  

preference.setSummary(listPreference.getValue());

将抛出 Resources $ NotFoundException :字符串资源ID,因为它将整数agrument作为资源类型。因此,最好将值包装在String中,例如:

preference.setSummary(String.valueOf(listPreference.getValue()));