@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:
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 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!