@ Garret Wilson Muito obrigado! Como um noob para a codificação do Android, eu fiquei preso com o problema de incompatibilidade de preferências por tantas horas, e acho tão decepcionante que eles tenham depreciado o uso de alguns métodos / abordagens para novos que não são suportados pelas APIs mais antigas. ter que recorrer a todos os tipos de soluções alternativas para fazer seu aplicativo funcionar em uma ampla variedade de dispositivos. É realmente frustrante!
Sua classe é ótima, pois permite que você continue trabalhando em novas APIs com preferências do jeito que costumava ser, mas não é compatível com versões anteriores. Como estou tentando alcançar uma ampla variedade de dispositivos, trabalhei um pouco com ele para fazê-lo funcionar em dispositivos anteriores à API 11 e em APIs mais recentes:
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
}
}
}
Testado em dois emuladores (2.2 e 4.2) com sucesso.
Por que meu código parece tão ruim?
Sou iniciante em codificação Android e não sou o maior fã de java.
Para evitar o aviso preterido e forçar o Eclipse a me permitir compilar, tive que recorrer a anotações, mas elas parecem afetar apenas classes ou métodos; portanto, tive que mover o código para dois novos métodos para tirar vantagem disso.
Eu não gostaria de escrever meu ID de recurso xml duas vezes sempre que copiar e colar a classe para uma nova PreferenceActivity, então criei uma nova variável para armazenar esse valor.
Espero que isso seja útil para outra pessoa.
PS: Desculpe pelas minhas opiniões opinativas, mas quando você se torna novo e encontra essas desvantagens, não pode evitar ficar frustrado!