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:
- Android - Categorías de encabezados en PreferenceActivity con PreferenceFragment
- PreferenceFragment es compatible con todos los problemas de API
- El elemento ListView no permanecerá "seleccionado"
- RunTimeException en PreferenceFragment
- Implementación de "color selector" de Android PreferenceScreen
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".
- ¿Hay una manera de mantener los divisores alrededor de una preferencia no seleccionable?
- Mantenga la barra de acciones visualizada al cambiar PreferenceScreen
- ¿PreferenceFragment con el fondo transparente?
- Cambiar el color de texto PreferenceActivity
- ¿Es posible combinar un EditTextPreference con un CheckBoxPreference?
- El botón de retroceso de Android no vuelve a la actividad anterior
- ¿Cómo referenciar o "encontrar" una PreferenceActivity?
- Uso de findviewbyid en preferenciaactividad
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:
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 anularonBindViewHolder()
. Este método le permite obtener referencias a la vista de su preferencia a través del objetoViewHolder
. - Infla tu vista personalizada usando
setWidgetLayoutResourece()
osetLayoutResource()
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.
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.
- Diferencia entre View y ViewGroup en Android
- ListView en ArrayAdapter orden se mezcla cuando se desplaza