Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo utilizar support.v7.preference con AppCompat y posibles inconvenientes

Estaba intentando implementar preferencias para una aplicación de AppCompat, usando support.v7.preference. Me tomó un par de días para pasar por esto, ya que support.v7.preference tiene algunas diferencias significativas con las preferencias nativas … lo cual no es tan malo una vez que lo sabes, pero por desgracia hay poca documentación por ahí. Pensé compartir mis descubrimientos para que otros no tuvieran que pasar por el mismo dolor.


Así que … pregunta:

¿Cómo implementar mejor las preferencias para las aplicaciones de AppCompat (con PreferenceFragment y AppCompatAcitivity siendo incompatibles)?

Aquí hay un par de preguntas relacionadas:

  • La sub-pantalla de preferencia no se abre cuando se usa support.v7.preference
  • ¿Cómo volver de Preferencias subscreen a la pantalla principal en PreferenceFragmentCompat?
  • PreferenceFragmentCompat requiere la preferenciaTheme ser fijado
  • ¿Cómo puedo crear preferencias personalizadas usando la biblioteca android.support.v7.preference?

Documentos oficiales aquí:

  • Http://developer.android.com/guide/topics/ui/settings.html
  • Http://developer.android.com/reference/android/support/v7/preference/Preference.html

  • ¿Cómo se declara el tipo de preferencia de Android?
  • Cómo establecer el valor predeterminado de un ListPreference
  • CheckBoxPreference con diseño propio
  • Lea SharedPreferences cuando no haya definido el nombre del archivo
  • Crear preferencia de diseño mediante programación
  • ¿Cómo obtengo las preferencias para trabajar en Android?
  • Recargar preferencias en PreferenciaActividad al reanudar
  • Preferencias de Android: Valores predeterminados incorrectos DESPITE "setDefaultValues"
  • One Solution collect form web for “Cómo utilizar support.v7.preference con AppCompat y posibles inconvenientes”

    Solución 1: Native PreferenceFragment con AppCompatActivity

    En AndroidStudio, elija Archivo> Nuevo proyecto> …> ConfiguraciónActividad . Esta plantilla utiliza una solución alternativa que modifica de nuevo el PreferenceFragment nativo para que funcione con AppCompatActivity , similar a support.v4.Fragment o support.v7.PreferenceFragmentCompat .

    • Pro: ahora puede utilizar la funcionalidad de preferencia nativa dentro de una aplicación AppCompat . Es un enfoque rápido cuando se utiliza la plantilla de AS, y puede atenerse a los documentos de preferencia ya los flujos de trabajo existentes.
    • Con: el retrofitting no es muy intuitivo o limpio. También, ya que normalmente es aconsejable utilizar librerías de soporte cuando estén disponibles, no estoy seguro de cómo es este método para el futuro.

    Solución 2: support.v7.preference.PreferenceFragmentCompat con AppCompatActivity

    • Pro: maximiza la compatibilidad
    • Con: una gran cantidad de huecos para el puente. También esto podría no funcionar con ninguna de las extensiones de preferencias existentes-libs ahí fuera (por ejemplo, ColorPicker o FontPreferences ).

    Si decide no usar la Solución 1 (todavía no estoy seguro de cuál de los dos es más a prueba de futuro), hay un par de inconvenientes al utilizar support.v7.preference .

    Los inconvenientes importantes del uso de la Solución 2 se mencionan a continuación.

    Dependencias:

     dependencies { ... compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:preference-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' } 

    Tema: Tendrás que definir un tema de preferenceTheme en tu styles.xml, de lo contrario, tu aplicación generará una excepción.

     <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> </style> 

    Es posible que desee dividir esto en diferentes estilos para 7 + / 14 + / 21 +. Mucha gente se queja de esto ser buggy en el momento de escribir este artículo. Hay una respuesta muy completa disponible aquí .

    Cambios de comportamiento: usar las preferencias nativas es extremadamente sencillo: todo lo que necesitas hacer es definir / mantener tu preferences.xml y usar addPreferencesFromResource(R.xml.preferences) dentro de tu PreferenceFragment . Las preferencias personalizadas se realizan fácilmente mediante la subclasificación de DialogPreference y, a continuación, sólo se hace referencia a dentro de las preferences.xml … bam, funciona.

    Lamentablemente, support.v7.preference ha tenido todo lo relacionado con el tratamiento de Fragment despojado, lo que hace que pierda una gran parte de su funcionalidad incorporada. En lugar de simplemente mantener un XML, ahora tiene que subclase y reemplazar un montón de cosas, todo lo cual es desafortunadamente indocumentado.

    PreferenceScreens: PreferenceScreens ya no son administradas por el framework. Definiendo una PreferenceScreen la pantalla de su preference.xml (como se describe en los documentos ) se mostrará la entrada, pero al hacer clic en ella no hace nada. Ahora le toca a usted lidiar con la visualización y navegación de sub-pantallas. Aburrido.

    Hay un acercamiento (descrito aquí ), agregando un PreferenceFragmentCompat.OnPreferenceStartScreenCallback a su PreferenceFragmentCompat . Si bien este enfoque se implementa rápidamente, simplemente cambia el contenido del fragmento de preferencia existente. Lo malo es: no hay vuelta de navegación, siempre estás "en la parte superior", que no es muy intuitivo para el usuario.

    En otro enfoque (descrito aquí ), también tendrá que administrar la pila trasera para lograr la navegación posterior como se esperaba. Esto usa preferenceScreen.getKey() como raíz para cada fragmento recién creado / mostrado.

    Al hacerlo, también puede tropezar con los PreferenceFragments son transparentes por defecto y sumándose extrañamente uno encima del otro. La gente tiende a anular PreferenceFragmentCompat.onViewCreated() para agregar algo como

     // Set the default white background in the view so as to avoid transparency view.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.background_material_light)); 

    Custom DialogPreference: Hacer sus propias preferencias también ha pasado de trivial a aburrido. DialogPreference ahora tiene cualquier cosa que se ocupa del diálogo real, quitado. Ese bit ahora vive en PreferenceDialogFragmentCompat . Así que tendrás que subclasificar ambos, luego tratar de crear el diálogo y mostrarlo tú mismo (explicado aquí ).

    Mirando el origen de PreferenceFragmentCompat.onDisplayPreferenceDialog() muestra que sabe cómo manejar exactamente 2 preferencias de diálogo ( EditTextPreference , ListPreference ), todo lo demás que tendrás que implementar usando OnPreferenceDisplayDialogCallback s … uno se pregunta, ¿por qué no hay Funcionalidad para manejar la subclase de DialogPreference !


    He aquí un código que implementa la mayoría de estas soluciones y las coloca en un módulo lib:

    https://github.com/mstummer/extended-preferences-compat.git

    Las principales intenciones fueron:

    • Eliminar la necesidad de ampliar y fiddle con Activity y PreferenceFragment en cada aplicación / proyectos. preference.xml es de nuevo el único archivo por proyecto que se puede cambiar o mantener.
    • Maneje y muestre PreferenceScreens (sub-pantallas) como se esperaba.
    • Un-split DialogPreference para restaurar el comportamiento nativo.
    • Manejar y mostrar cualquier subclase de DialogPreference .

    No piense que es lo suficientemente limpio como para ser utilizado fuera de la caja, pero podría darle algunas pistas cuando se trata de problemas similares. Dale una vuelta y déjame saber si tienes alguna sugerencia.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.