Acabo de notar el hecho de que el método addPreferencesFromResource(int preferencesResId)
está marcado como obsoleto en la documentación de Android ( Entrada de referencia ).
Desafortunadamente, no se proporciona ningún método alternativo en la descripción del método.
¿Qué método se debe utilizar en su lugar para conectar un PreferScreen.xml a la PreferenceActivity correspondiente?
addPreferencesFromResource(int preferencesResId)
. Me estoy perdiendo de algo ?Respuestas:
No se proporciona ningún método alternativo en la descripción del método porque el enfoque preferido (a partir del nivel 11 de API) es instanciar objetos PreferenceFragment para cargar sus preferencias desde un archivo de recursos. Vea el código de muestra aquí: PreferenceActivity
fuente
Para agregar más información a la respuesta correcta anterior, después de leer un ejemplo de Android-er descubrí que puede convertir fácilmente su actividad de preferencia en un fragmento de preferencia. Si tienes la siguiente actividad:
Los únicos cambios que tiene que hacer es crear una clase de fragmento interno, moverlo
addPreferencesFromResources()
al fragmento e invocar el fragmento de la actividad, de esta manera:Puede haber otras sutilezas para hacer preferencias más complejas a partir de fragmentos; si es así, espero que alguien los note aquí.
fuente
addPreferencesFromResources()
en el intercambio de PreferenceFragment? Parece innecesario desde el punto de vista del principiante.@Garret Wilson ¡Muchas gracias! Como novato en la codificación de Android, he estado atrapado con el problema de incompatibilidad de preferencias durante tantas horas, y me parece tan decepcionante que desaprobaron el uso de algunos métodos / enfoques para los nuevos que no son compatibles con las API más antiguas. tener que recurrir a todo tipo de soluciones para que su aplicación funcione en una amplia gama de dispositivos. ¡Es realmente frustrante!
Su clase es excelente, ya que le permite seguir trabajando en nuevas API con preferencias de la forma en que solía ser, pero no es compatible con versiones anteriores. Como estoy tratando de llegar a una amplia gama de dispositivos, trabajé un poco para que funcione en dispositivos anteriores a API 11, así como en API más nuevas:
Probado en dos emuladores (2.2 y 4.2) con éxito.
Por qué mi código se ve tan malo:
Soy un novato en la codificación de Android, y no soy el mejor fanático de Java.
Para evitar la advertencia obsoleta y forzar a Eclipse a permitirme compilar, tuve que recurrir a anotaciones, pero estas parecen afectar solo las clases o los métodos, por lo que tuve que mover el código a dos métodos nuevos para aprovechar esto.
No me gustaría tener que escribir mi ID de recurso xml dos veces cada vez que copio y pego la clase para una nueva PreferenceActivity, por lo que creé una nueva variable para almacenar este valor.
Espero que esto sea útil para alguien más.
PD: Perdón por mis opiniones obstinadas, pero cuando vienes nuevo y encuentras tales desventajas, ¡no puedes evitar frustrarte!
fuente
Mi enfoque es muy cercano al de Garret Wilson (gracias, te voté;)
Además, ofrece compatibilidad con Android <3.
Acabo de reconocer que mi solución está aún más cerca de la de Kevin Remo . Es solo un poquito más limpio (ya que no se basa en el antipatrón "expection" ).
Para un ejemplo "real" (pero más complejo) vea NusicPreferencesActivity y NusicPreferencesFragment .
fuente
@SuppressLint("NewApi")
- evite - sea más preciso. ¿Lo has ejecutado por apis bajos? Se tiraráVerifyError
@SuppressLint("NewApi")
estilo es simplemente malo@SuppressLint("NewApi")
en esta situación particular?@TargetApi(Build.VERSION_CODES.HONEYCOMB)
- no todas las advertencias para ninguna API :)En lugar de excepciones, solo use:
y use
para suprimir las advertencias.
fuente
En lugar de usar un
PreferenceActivity
para cargar directamente las preferencias, use unAppCompatActivity
o equivalente que cargue unPreferenceFragmentCompat
que cargue sus preferencias. Es parte de la biblioteca de soporte (ahora Android Jetpack) y proporciona compatibilidad con API 14.En su
build.gradle
, agregue una dependencia para la biblioteca de soporte de preferencias:Nota: Vamos a suponer que ya tiene sus preferencias XML creadas.
Para su actividad, cree una nueva clase de actividad. Si está utilizando temas materiales, debe extender un
AppCompatActivity
, pero puede ser flexible con esto:Ahora para la parte importante: cree un fragmento que cargue sus preferencias desde XML:
Para obtener más información, lea los documentos para desarrolladores de Android
PreferenceFragmentCompat
.fuente