The following code-snippet shows a fragment, which is to show some preferences including a custom preference (ColorPickerPreference
).
public static class PlayerEditFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.profile_player_edit);
...
The xml-file defining the preferences looks like this:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:key="prof_key_player"
android:title="Player" >
<EditTextPreference
android:key="prof_key_player_name"
android:title="Name" />
<de.jhouse.agt.view.dialog.ColorPickerPreference
android:defaultValue="2130837679"
android:key="prof_key_player_color"
android:title="Color" />
<de.jhouse.agt.view.dialog.NumberPickerPreference
android:defaultValue="0"
android:key="prof_key_player_pos"
android:title="Position" />
</PreferenceCategory>
</PreferenceScreen>
And the custom preference ColorPickerPreference
which enables the user to select a color from a list of predefined colors in a dialog:
public class ColorPickerPreference extends DialogPreference {
// the images to display
public static final Integer[] imageIDs = { R.drawable.player_white,
R.drawable.player_black, R.drawable.player_orange,
R.drawable.player_green, R.drawable.player_grey,
R.drawable.player_red, R.drawable.player_blue,
R.drawable.player_yellow, R.drawable.player_brown, };
private Gallery gallery;
private int value;
public ColorPickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ColorPickerPreference(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected View onCreateDialogView() {
final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
gallery = new Gallery(getContext());
gallery.setLayoutParams(layoutParams);
gallery.setAdapter(new ImageAdapter(getContext()));
gallery.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
setValue(imageIDs[position]);
}
});
final FrameLayout dialogView = new FrameLayout(getContext());
dialogView.addView(gallery);
return dialogView;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
gallery.setSelection(getValue(), true);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
setValue(gallery.getSelectedItemPosition());
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
Integer value = a.getInt(index, imageIDs[4]);
return value;
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue,
Object defaultValue) {
setValue(restorePersistedValue ? getPersistedInt(imageIDs[4])
: (Integer) defaultValue);
}
public void setValue(int value) {
this.value = value;
persistInt(this.value);
}
public int getValue() {
return this.value;
}
/**
*
* @author Andy
*
*/
public static class ImageAdapter extends BaseAdapter {
private Context context;
private int itemBackground;
public ImageAdapter(Context c) {
context = c;
// sets a grey background; wraps around the images
TypedArray a = context.obtainStyledAttributes(R.styleable.MyGallery);
itemBackground = a.getResourceId(R.styleable.MyGallery_android_galleryItemBackground, 0);
a.recycle();
}
// returns the number of images
public int getCount() {
return imageIDs.length;
}
// returns the ID of an item
public Object getItem(int position) {
return position;
}
// returns the ID of an item
public long getItemId(int position) {
return position;
}
// returns an ImageView view
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageIDs[position]);
imageView.setLayoutParams(new Gallery.LayoutParams(100, 100));
imageView.setBackgroundResource(itemBackground);
return imageView;
}
}
}
The problem now is, when the statetement addPreferencesFromResource(R.xml.profile_player_edit)
is executed, it throws a ClassCastException : Cannot cast String to int.
I cannot figure out what I did wrong, but if I exclude the custom preference ColorPickerPreference everything works fine?
Here's the complete Stacktrace:
02-10 15:35:45.778: D/AndroidRuntime(19737): Shutting down VM
02-10 15:35:45.798: E/AndroidRuntime(19737): FATAL EXCEPTION: main
02-10 15:35:45.798: E/AndroidRuntime(19737): Process: de.jhouse.agt, PID: 19737
02-10 15:35:45.798: E/AndroidRuntime(19737): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:239)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.Preference.getPersistedInt(Preference.java:1697)
02-10 15:35:45.798: E/AndroidRuntime(19737): at de.jhouse.agt.view.dialog.ColorPickerPreference.onSetInitialValue(ColorPickerPreference.java:103)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.Preference.dispatchSetInitialValue(Preference.java:1514)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.Preference.onAttachedToHierarchy(Preference.java:1309)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:167)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:108)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:45)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.GenericInflater.rInflate(GenericInflater.java:488)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.GenericInflater.inflate(GenericInflater.java:326)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.GenericInflater.inflate(GenericInflater.java:263)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:300)
02-10 15:35:45.798: E/AndroidRuntime(19737): at de.jhouse.agt.activity.ProfileEditActivity$PlayerEditFragment.onCreate(ProfileEditActivity.java:620)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.Fragment.performCreate(Fragment.java:2075)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:868)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.BackStackRecord.run(BackStackRecord.java:833)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:452)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.os.Handler.handleCallback(Handler.java:739)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.os.Handler.dispatchMessage(Handler.java:95)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.os.Looper.loop(Looper.java:145)
02-10 15:35:45.798: E/AndroidRuntime(19737): at android.app.ActivityThread.main(ActivityThread.java:5834)
02-10 15:35:45.798: E/AndroidRuntime(19737): at java.lang.reflect.Method.invoke(Native Method)
02-10 15:35:45.798: E/AndroidRuntime(19737): at java.lang.reflect.Method.invoke(Method.java:372)
02-10 15:35:45.798: E/AndroidRuntime(19737): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
02-10 15:35:45.798: E/AndroidRuntime(19737): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)