@Garret Wilson Grazie mille! Come noob per la codifica Android, sono stato bloccato con il problema dell'incompatibilità delle preferenze per così tante ore e lo trovo così deludente che hanno deprecato l'uso di alcuni metodi / approcci per quelli nuovi che non sono supportati dalle API precedenti quindi dover ricorrere a tutti i tipi di soluzioni alternative per far funzionare la tua app su una vasta gamma di dispositivi. È davvero frustrante!
La tua classe è fantastica, perché ti consente di continuare a lavorare su nuove API con le preferenze come una volta, ma non è compatibile con le versioni precedenti. Dal momento che sto cercando di raggiungere una vasta gamma di dispositivi, ci ho provato un po 'per farlo funzionare nei dispositivi pre API 11 e nelle API più recenti:
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
}
}
}
Testato su due emulatori (2.2 e 4.2) con esito positivo.
Perché il mio codice sembra così scadente:
Sono un noob per la codifica Android e non sono il più grande fan di Java.
Per evitare l'avvertimento deprecato e per forzare Eclipse a consentirmi di compilare, ho dovuto ricorrere alle annotazioni, ma queste sembrano influenzare solo le classi o i metodi, quindi ho dovuto spostare il codice su due nuovi metodi per trarne vantaggio.
Non vorrei scrivere il mio ID di risorsa xml due volte ogni volta che copio e incollo la classe per un nuovo PreferenceActivity, quindi ho creato una nuova variabile per memorizzare questo valore.
Spero che questo sia utile a qualcun altro.
PS: Mi dispiace per le mie opinioni supposte, ma quando vieni nuovo e trovi tali handicap, non puoi far altro che frustrarti!