¿Cómo se crean Fragmentos de preferencias y preferencias en Android?

Como estaba siguiendo un antiguo tutorial ( Createz des applications para Android -> openclassroom ) me quedé atascado en este método obsoleto addPreferencesFromResource(int id) de la clase PreferenceActivity.

Así que mi pregunta es:

¿Cuál es la nueva forma de crear Preferencias en Android?

He encontrado este post ( ¿Qué se debe utilizar en lugar de "addPreferencesFromResource" en una PreferenceActivity? ) Que me ayudan a entender que usted tiene que pasar por un PreferenceFragment para hacerlo.

En la siguiente explicación utilizo your.package. Sólo para mostrar que tienes que poner el nombre del paquete. Todo el mundo tiene su propio paquete por lo que debe sustituirlo por su paquete.

vamos a empezar :


1. Fragmento de preferencia

  • Cree su clase PreferenceFragment

    MyPreferenceFragment

     public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.fragment_preference); } } 

  • Entonces el recurso xml asociado

    Fragment_preference.xml (en la carpeta res / xml de su proyecto)

     <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="FOO"> <CheckBoxPreference android:key="checkBoxPref" android:title="check it out" android:summary="click this little box"/> </PreferenceCategory> </PreferenceScreen> 

    Eso es todo para la parte del Fragment .


2. Actividad de preferencia

  • Cree la clase PreferenceActivity

    MyPreferenceActivity

     public class MyPreferenceActivity extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.headers_preference, target); } @Override protected boolean isValidFragment(String fragmentName) { return MyPreferenceFragment.class.getName().equals(fragmentName); } } 

    No olvide anular el isValidFragment(String fragmentName) ya que recibirá un golpe en la cara por su aplicación! 😉 Más en serio que no tengo idea de por qué necesita hacer esto, pero es necesario. Si alguien tiene una explicación sobre esto, lo leería con gusto 🙂

    EDIT:


    Gracias a kirtan403 Ahora sé por qué es necesario: tiene que ser fijado debido a una ( inyección de fragmento de marco Android ).


    Como se puede ver en el onBuildHeaders(List<Header> target) , onBuildHeaders(List<Header> target) otro archivo xml que contiene los encabezados de la preferencia. En resumen, los encabezados son la parte izquierda de la preferencia y el fragmento es la parte derecha (para la tableta). Para un teléfono, primero tendrá los encabezados y al hacer clic en un elemento, el fragmento correspondiente se colocará encima de la lista de encabezados.

    Lea este artículo ( Desarrollo de múltiples paneles en Android con Fragmentos – Tutorial ) las imágenes se explican a sí mismas.

  • Entonces el recurso xml asociado

    Headers_preference.xml (en la carpeta res / xml de su proyecto)

     <?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="your.package.MyPreferenceFragment" android:title="Goto: Preference fragment" android:summary="An example of some preferences." /> </preference-headers> 

    Como usted puede haber notado en la sección de encabezado usted tiene:

    android:fragment="your.package.MyPreferenceFragment"

    Esto actuará como un enlace al fragmento que desea mostrar. En Tablet se cargará en la parte derecha y en el teléfono se cargará en la parte superior de la vista actual.


3. Manifiesto de Android

Ahora lo que debe hacer es agregar su actividad al archivo AndroidManifest.xml .

Dentro de la sección de la application , añada estas líneas:

 <activity android:name="your.package.MyPreferenceActivity" android:label="Preferences"> </activity> 

Usted probablemente me dirá:

"Oh querido te olvidaste de poner android: launchMode =" singleTask " en tu actvity"

Pero NO PONGA ESTE como usted nunca cargará su fragmento en el teléfono. ¡Este error fue resuelto por un gran hombre! Este es el enlace a su blog ( preferencias de encabezado de Android en pantalla pequeña / teléfono ).


4. Inicie el menú Preferencias del menú

¡Finalmente necesitas agregar la habilidad de mostrar esta Preferencia !! Para ello necesitará 3 cosas:

  • El menú

    Menu.xml (en la carpeta res / menu de su proyecto)

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/preferences" android:title="Preferences" /> </menu> 

  • Cargando este Menú en su actividad Principal (no en la PreferenciaActividad) bajo el método onCreateOptionsMenu(Menu menu)

     @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } 

  • Iniciando la Actividad MyPreferenceActivity al hacer clic en ese botón.

    Para eso necesitará anular el onOptionsItemSelected(MenuItem item) en su actividad principal.

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.preferences: { Intent intent = new Intent(); intent.setClassName(this, "your.package.MyPreferenceActivity"); startActivity(intent); return true; } } return super.onOptionsItemSelected(item); } 


Et voila les amis!

No he probado este código. Lo tomé y lo modificé de mi propio código para que no tenga bien copiado las cosas pegadas. Si te encuentras con errores, dímelo, trataré de resolver el problema y arreglar esto.

Espero que este post ayudará a algunas personas por ahí: D

Saludos!

Me gustó la solución de este post: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

.. porque parece el más compacto para alguien que sólo necesita algo muy básico y funcionando rápidamente. Tiene sólo un archivo .java y dos pequeños archivos xml.

Actividad RECORDATORIOS

Después de agregar los 3 archivos a su proyecto, no olvide

A) Agregue el archivo Prefs Activity to Manifest
B) Añade alguna forma de iniciar la Actividad de Prefs, por ejemplo, un botón o un elemento de menú

Agregue los siguientes archivos a su proyecto. Utilice el orden en el que se enumeran para evitar errores de compilación.

  1. Añadir /res/values/array.xml

     <resources> <string-array name="listArray"> <item>Ace</item> <item>Club</item> </string-array> <string-array name="listValues"> <item>Ace</item> <item>Club</item> </string-array> </resources> 
  2. Añadir /res/xml/preferences.xml

     <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:title="Your Name" android:key="username" android:summary="Please provide your username"></EditTextPreference> <CheckBoxPreference android:title="Application Updates" android:defaultValue="false" android:summary="This option if selected will allow the application to check for latest versions." android:key="applicationUpdates" /> <ListPreference android:title="Download Details" android:summary="Select the kind of data that you would like to download" android:key="downloadType" android:defaultValue="Ace" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceScreen> 
  3. Añadir el código de actividad

     public class AppPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); checkValues(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } private void checkValues() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String strUserName = sharedPrefs.getString("username", "NA"); boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false); String downloadType = sharedPrefs.getString("downloadType","1"); String msg = "Cur Values: "; msg += "\n userName = " + strUserName; msg += "\n bAppUpdates = " + bAppUpdates; msg += "\n downloadType = " + downloadType; Toaster.shortDebug(msg); } } 
  • Diferencia entre "@ id /" y "@ + id /" en Android
  • Uso de la barra de herramientas AppCompat con FrameLayout
  • Android getMeasuredHeight devuelve valores erróneos!
  • Botón con fondo transparente oscurece en Lolipop android
  • Añadir diseño personalizado a la barra de herramientas
  • Mala disposición XML con Eclipse-ADT
  • Proveedor de archivos de Android Illegal Argument Exception
  • La definición plural se ignora para la cantidad cero
  • Estilo de fila ListView: texto alineado a la izquierda e icono alineado a la derecha
  • ¿Cómo cambiar el color del icono que se coloca dentro de edittext?
  • Cómo iniciar / iniciar el android estilo de actividad más rápido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.