¿Qué usar en lugar de "addPreferencesFromResource" en una PreferenceActivity?

Resuelto mweisz asked hace 54 años • 6 respuestas

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 debería usarse en su lugar para conectar un referenceScreen.xml a la PreferenceActivity correspondiente?

mweisz avatar Jan 01 '70 08:01 mweisz
Aceptado

No se proporciona ningún método alternativo en la descripción del método porque el enfoque preferido (a partir del nivel API 11) es crear instancias de objetos PreferenceFragment para cargar sus preferencias desde un archivo de recursos. Vea el código de muestra aquí: PreferenceActivity

glorifiedHacker avatar Jul 25 '2011 21:07 glorifiedHacker

Para agregar 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 preferencias en un fragmento de preferencias. Si tienes 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 debe realizar son crear una clase de fragmento interna, moverla addPreferencesFromResources()al fragmento e invocar el fragmento desde la actividad, de esta manera:

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 al hacer preferencias más complejas a partir de fragmentos; Si es así, espero que alguien los anote aquí.

Garret Wilson avatar Nov 18 '2012 15:11 Garret Wilson

@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 muy decepcionante que hayan desaprobado el uso de algunos métodos/enfoques para otros 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 como solía ser, pero no es compatible con versiones anteriores. Como estoy tratando de llegar a una amplia gama de dispositivos, lo modifiqué un poco para que funcione en dispositivos anteriores a API 11, así como en API más nuevas:

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 mal:

Soy un novato en la codificación de Android y no soy el mayor fanático de Java.

Para evitar la advertencia obsoleta y forzar a Eclipse a permitirme compilar, tuve que recurrir a anotaciones, pero parecen afectar solo a clases o métodos, por lo 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 cada vez que copio y pego 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.

PD: Perdón por mis puntos de vista obstinados, pero cuando eres nuevo y encuentras tales desventajas, ¡no puedes evitar frustrarte!

ecv avatar Dec 12 '2012 05:12 ecv