tutorial studio programacion preferencias preferencia móviles español editar desarrollo curso crear compartidas archivos aplicaciones android android-layout android-preferences preferenceactivity

studio - Android: crear preferencias personalizadas



manual de programacion android pdf (5)

¿Es posible crear una preferencia individual en una PreferenceScreen ?

Me gustaría codificar configuraciones de color así:

Sé que elegir el color es fácil de realizar con ListPreference , pero sería increíble con ese tipo de "casillas de verificación".


Así es como lo hago, usando support library preference-v7 .

  • Extienda la Preference y anule onBindViewHolder() . Este método le permite obtener referencias a la vista de sus preferencias a través del objeto ViewHolder .
  • Infle su vista personalizada utilizando setWidgetLayoutResourece() o setLayoutResource() en el constructor.
  • Deshabilite el comportamiento de clic predeterminado de toda la vista de preferencias y solo permita hacer clic en las vistas personalizadas internas.

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 para crear configuraciones, que incluye una sección para crear preferencias personalizadas: http://developer.android.com/guide/topics/ui/settings.html#Custom


La página del desarrollador de Android solo muestra cómo crear un DialogFragment . Sin embargo, aún es posible personalizar la apariencia de un elemento de Preference . En su XML, debe declarar el elemento raíz como android:id="@android:id/widget_frame , y luego declarar TextView como android:title y android:summary . Luego puede declarar otros elementos que desee que aparezcan en el diseño. Aquí hay un ejemplo que muestra una SeekBar que puede adaptar fácilmente a un selector de color de casilla de verificación múltiple.

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 que se deriva de Preference , anula 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 usa 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 de la siguiente manera:

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


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


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

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

O puede usar una actividad en lugar de preferencia