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。
答案 0 :(得分:0)
试试这个。
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);
资源$ NotFoundException:字符串资源ID
更改强>
preference.setSummary(listPreference.getValue());
以强>
preference.setSummary(listPreference.getValue() +"");
注意强>
如果值为对象,则您希望将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);
。
restorePersistedValue
返回boolean Data
getPersistedInt(minValue)
返回int Data
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()));