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


¿Qué utilizar en lugar de "addPreferencesFromResource" en una PreferenciaActividad?

Acabo de notar el hecho de que el método addPreferencesFromResource(int preferencesResId) está marcado obsoleto en la documentación de Android ( Reference Entry ).

Lamentablemente, no se proporciona ningún método alternativo en la descripción del método.

¿Qué método se debe utilizar en lugar de otro para conectar una preferencia Screen.xml a la preferencia PreferenceActivity?

  • ¿Hay alguna implementación de StAX para Android?
  • Android trazo discontinuo potencial ICS potencial error
  • Haga que EditText crezca a medida que se llena
  • Barra de herramientas y Fragmento
  • Cómo crear un botón de acción flotante (FAB) en android, utilizando AppCompat v21?
  • Signo de interrogación (?) En atributos XML para Android
  • ¿Por qué el estilo y el diseño no usan el espacio de nombres de Android?
  • Crear lista de capas con esquinas redondeadas mediante programación
  • 5 Solutions collect form web for “¿Qué utilizar en lugar de "addPreferencesFromResource" en una PreferenciaActividad?”

    No se proporciona ningún método alternativo en la descripción del método porque la aproximación preferida (a partir del nivel 11 de la API) consiste en instanciar objetos PreferenceFragment para cargar sus preferencias desde un archivo de recursos. Vea el código de ejemplo aquí: PreferenciaActividad

    Para añadir más información a la respuesta correcta anterior, después de leer un ejemplo de Android-er , descubrí que puedes convertir fácilmente tu actividad de preferencia en un fragmento de preferencia. Si tiene la siguiente actividad:

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } 

    Los únicos cambios que debes hacer es crear una clase de fragmento interno, mover el addPreferencesFromResources() al fragmento e invocar el fragmento de la actividad, como esto:

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } } 

    Puede haber otras sutilezas en hacer preferencias más complejas a partir de fragmentos; Si es así, espero que alguien las note aquí.

    @Garret Wilson ¡Muchas gracias! Como noob a la codificación androide, he estado atascado con el problema de incompatibilidad de preferencias durante tantas horas, y me parece tan decepcionante que desaprobó el uso de algunos métodos / enfoques para los nuevos que no son compatibles con las API más antiguas, por lo tanto Teniendo que recurrir a todo tipo de soluciones para hacer que su aplicación funcione en una amplia gama de dispositivos. ¡Es muy frustrante!

    Su clase es grande, 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. Desde que estoy tratando de llegar a una amplia gama de dispositivos que jugueteado con un poco para que funcione en los dispositivos antes de API 11, así como en las API más recientes:

     import android.annotation.TargetApi; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; public class MyPrefsActivity extends PreferenceActivity { private static int prefs=R.xml.myprefs; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { getClass().getMethod("getFragmentManager"); AddResourceApi11AndGreater(); } catch (NoSuchMethodException e) { //Api < 11 AddResourceApiLessThan11(); } } @SuppressWarnings("deprecation") protected void AddResourceApiLessThan11() { addPreferencesFromResource(prefs); } @TargetApi(11) protected void AddResourceApi11AndGreater() { getFragmentManager().beginTransaction().replace(android.R.id.content, new PF()).commit(); } @TargetApi(11) public static class PF extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(MyPrefsActivity.prefs); //outer class // private members seem to be visible for inner class, and // making it static made things so much easier } } } 

    Probado en dos emuladores (2.2 y 4.2) con éxito.

    ¿Por qué mi código se ve tan malo:

    Soy un noob a la codificación del androide, y no soy el ventilador más grande de Java.

    Para evitar la advertencia obsoleta y obligar a Eclipse a permitirme compilar tuve que recurrir a anotaciones, pero éstas parecen afectar sólo a clases o métodos, así que tuve que mover el código a dos nuevos métodos para aprovechar esto.

    No me gustaría tener que escribir mi id de recurso xml dos veces en cualquier momento copiar y pegar la clase para una nueva PreferenceActivity, así que creé una nueva variable para almacenar este valor.

    Espero que esto sea útil para alguien más.

    PS: Lo siento por mis opiniones de opinión, pero cuando vienes nuevo y encontrar esas desventajas, no se puede evitar, pero para conseguir frustrado!

    Mi enfoque es muy cercano a Garret Wilson (gracias, voté por usted;)

    Además, proporciona compatibilidad descendente con Android <3.

    Acabo de reconocer que mi solución está aún más cerca de la de Kevin Remo . Es sólo un pequeño limpiador bit (ya que no se basan en la "expectativa" antipattern ).

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { onCreatePreferenceActivity(); } else { onCreatePreferenceFragment(); } } /** * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (ie API lvl * < 11). */ @SuppressWarnings("deprecation") private void onCreatePreferenceActivity() { addPreferencesFromResource(R.xml.preferences); } /** * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (ie API lvl >= * 11). */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void onCreatePreferenceFragment() { getFragmentManager().beginTransaction() .replace(android.R.id.content, new MyPreferenceFragment ()) .commit(); } } 

    Para un ejemplo "real" (pero más complejo) vea NusicPreferencesActivity y NusicPreferencesFragment .

    En lugar de excepciones, sólo use:

     if (Build.VERSION.SDK_INT >= 11) 

    y use

     @SuppressLint("NewApi") 

    Para suprimir las advertencias.

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