Android: Creación de preferencias personalizadas

¿Es posible crear una preferencia individual en una PreferenceScreen ?

Me gustaría codificar la configuración de color de esa manera:

Preferencia de color

Sé que la elección del color es fácil realizable con el ListPreference , pero sería impresionante con ese tipo de "casillas de verificación".

La página de desarrollador de Android sólo muestra cómo crear un DialogFragment. Todavía es posible personalizar la apariencia de un elemento de preferencia sin embargo. En su XML tiene que declarar el elemento raíz como id: widget_frame, y luego declarar textviews como título y resumen. A continuación, puede declarar otros elementos que desea que aparezcan en el diseño. Aquí hay un ejemplo que muestra un SeekBar que se puede adaptar fácilmente a un selector de color multi-checkbox.

Seekbar_preference.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/widget_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@android:id/title" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" /> <TextView android:id="@android:id/summary" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Summary" /> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

Luego, en una clase derivada de Preferencia, invalide el método onCreateView:

SeekbarPreference.java

 @Override protected View onCreateView( ViewGroup parent ) { LayoutInflater li = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); return li.inflate( R.layout.seekbar_preference, parent, false); } 

Luego, en el archivo preferences.xml use la preferencia:

Preferences.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <com.example.SeekbarPreference android:key="pref_max_volume" android:title="@string/max_volume" /> <com.example.SeekbarPreference android:key="pref_balance" android:title="@string/balance" /> </PreferenceScreen> 

Esto da una preferencia que se ve como sigue:

Elemento de preferencia de búsqueda

Puede adaptar fácilmente este método para mostrar múltiples casillas de verificación en una fila como estaba en la pregunta original.

Así es como lo hago, usando la preference-v7 biblioteca de soporte preference-v7 .

  • Extender Preference y anular onBindViewHolder() . Este método le permite obtener referencias a la vista de su preferencia a través del objeto ViewHolder .
  • Infla tu vista personalizada usando setWidgetLayoutResourece() o setLayoutResource() en el constructor.
  • Deshabilite el comportamiento de clic predeterminado de toda la vista de preferencias y sólo permita que las vistas personalizadas en el interior puedan hacer clic.

preferencia

Layout / preference_theme.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/theme_light" ... /> <Button android:id="@+id/theme_dark"... /> <Button android:id="@+id/theme_sepia"... /> <Button android:id="@+id/theme_green"... /> </LinearLayout> 

PreferenceTheme.java (clase de preferencia personalizada)

 import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; public class PreferenceTheme extends Preference { public PreferenceTheme(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PreferenceTheme(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setWidgetLayoutResource(R.layout.preference_theme); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); holder.itemView.setClickable(false); // disable parent click View button = holder.findViewById(R.id.theme_dark); button.setClickable(true); // enable custom view click button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // persist your value here } }); // the rest of the click binding } } 

Preferences.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.preference.PreferenceCategory android:title="Reading"> <example.com.preference.PreferenceTheme android:key="pref_theme" android:title="Theme" android:defaultValue="light" /> ... </android.support.v7.preference.PreferenceCategory> </android.support.v7.preference.PreferenceScreen> 

Crear una preferencia personalizada es similar a crear un fragmento u otros componentes de la interfaz de usuario, definiendo vistas y acciones.

Los desarrolladores de Android tienen una buena guía sobre la creación de configuración, que incluye una sección para crear preferencias personalizadas: http://developer.android.com/guide/topics/ui/settings.html#Custom

Puede crear su diseño personalizado para su preferencia y puede configurarlo en el atributo android:layout en Preferencia en res / xml como este:

 <Preference ...................... android:layout="@layout/your_layout" /> 

O puede utilizar una actividad en lugar de preferencia

O una mejor alternativa será extender la clase DialogPreference. Puede configurar un widget selector de color como la vista de diálogo y obtener el resultado positivo dentro de la preferencia extendida en sí. Aquí hay una pregunta similar, pero es muy útil para su escenario.

  • Android anidado PreferenceScreen con ActionBar
  • Cambiar dinámicamente el recurso widgetlayout de la preferencia de Android
  • No se puede establecer la preferencia con PreferenceActivity
  • Cómo setOnTouchListener () en un ListPreference?
  • El icono de inicio de la barra de acción PreferenceActivity no volverá a casa (a diferencia de ET :)
  • Preferencias de Android y fragmentos de diálogo
  • Compatibilidad para SwitchPreference (pre ICS)?
  • Preferencias sin métodos obsoletos
  • ¿Cómo obtener elementos (findViewById) para un diseño que se carga dinámicamente (setView) en un diálogo?
  • Uso de preferencias no predeterminadas en PreferenceActivity
  • Android: Iniciar la actividad de preferences.xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.