There are many Android color pickers used for preferences, but they all seem to be unnecessary complex for an ordinary user. If all you need is to let the user choose a single color from a set, you can use this simple class which is conveniently integrated into the Preferences scheme.
Put it in a class, and use it from your preferences.xml. Apache license.
/* * Copyright (C) 2011-2012 George Yunaev * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. */ public class ColorPreference extends DialogPreference implements DialogInterface.OnClickListener { // Keeps the colors in the nice integer format private int[] m_colors; // Font adaptor responsible for redrawing the item TextView with the appropriate background color public class ColorAdapter extends BaseAdapter { @Override public int getCount() { return m_colors.length; } @Override public Object getItem(int position) { return m_colors[ position ]; } @Override public long getItemId(int position) { // We use the position as ID return position; } @Override public View getView( int position, View convertView, ViewGroup parent ) { View view = convertView; // This function may be called in two cases: a new view needs to be created, // or an existing view needs to be reused if ( view == null ) { // Since we're using the system list for the layout, use the system inflater final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); // And inflate the view android.R.layout.select_dialog_singlechoice // Why? See com.android.internal.app.AlertController method createListView() view = inflater.inflate( android.R.layout.select_dialog_singlechoice, parent, false); } if ( view != null ) { // Find the text view from our interface CheckedTextView tv = (CheckedTextView) view.findViewById( android.R.id.text1 ); // Color the text view background using our color tv.setBackgroundColor( m_colors[position] ); } return view; } } public ColorPreference( Context context, AttributeSet attrs ) { super(context, attrs); // !!! TODO !!! // Here you should fill up the m_colors array with the colors you want to use. You can either // have a static initializer, or read the array from resources. } @Override protected void onPrepareDialogBuilder( Builder builder ) { super.onPrepareDialogBuilder(builder); int checked_item = 0; int selectedValue = getSharedPreferences().getInt( getKey(), 0 ); // Find out the checked item index for ( int idx = 0; idx < m_colors.length; idx++ ) { if ( m_colors[idx] == selectedValue ) { checked_item = idx; break; } } // Create out adapter // If you're building for API 11 and up, you can pass builder.getContext // instead of current context ColorAdapter adapter = new ColorAdapter(); builder.setSingleChoiceItems( adapter, checked_item, this ); // The typical interaction for list-based dialogs is to have // click-on-an-item dismiss the dialog builder.setPositiveButton( null, null ); } public void onClick(DialogInterface dialog, int which) { if ( which >=0 && which < m_colors.length ) { Editor editor = getSharedPreferences().edit(); editor.putInt( getKey(), m_colors[ which ] ); editor.commit(); dialog.dismiss(); } } }
Thanks for the code. I added this for feedback to the user:
@Override
protected void onBindView(View view) {
view.setBackgroundColor(getPreferenceManager().getSharedPreferences().getInt(getKey(), 0));
super.onBindView(view);
}
How to do this in a default time picker wheel? So that I can scroll and pick the color I want?