2010-10-26 4 views
0

J'ai quelques activités dans mon application que j'aimerais utiliser les préférences partagées. Initialement, j'ai créé une méthode dans chaque activité pour utiliser SharedPreferences, qui a bien fonctionné. Cependant, comme il y a plusieurs activités qui utilisent les mêmes données, je suis en train de mettre des méthodes similaires dans plusieurs endroits. Il semblait donc plus logique de créer une classe spécifiquement pour gérer toutes ces méthodes.Comment créer une classe spécifiquement dans le but d'utiliser SharedPreferences?

Malheureusement, je ne comprends pas comment le faire correctement.

Cela ne compile pas, car il dit « getSharedPreferences est non défini pour le type AppPrefs. »

public class AppPrefs { 
public void foo() { 
    SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0); 
} 
} 

Enfin, je pensais que, peut-être depuis SharedPreferences est une interface que je pouvais le faire, mais je » d avoir à implémenter les méthodes héritées. Je n'ai aucune raison de contourner l'une de ces méthodes, donc il n'y a aucune raison de le faire non plus.

public class AppPrefs implements SharedPreferences { 
public void foo() { 
    SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0); 
} 
} 

Qu'est-ce qui a du sens à faire ici? Y a-t-il un concept qui me manque? Quelqu'un pourrait-il élaborer et expliquer? Merci.

Répondre

1

Transmettez votre contexte dans vos préférences getter.

public class AppPrefs { 
public static void foo(Context ctx) { 
    SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0); 
} 
} 

Maintenant, juste passer à this d'une classe d'activité à foo()

1

Si les préférences sont globales pour l'application, vous pouvez utiliser PreferenceManager.getDefaultSharedPreferences(); lorsque vous avez besoin d'accéder aux préférences communes. Si les préférences sont spécifiques à un sous-ensemble de Activities, vous avez quelques options différentes:

Vous pouvez faire une sous-classe Activity qui est prolongée par toutes les classes qui ont besoin d'accéder aux préférences:

public abstract class AbstractFooActivity extends Activity 
{ 
    protected SharedPreferences getFooPreferences() 
    { 
     return getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
    } 

    private static final String PREFS_NAME = "FooPrefs"; 
} 

public class AFooActivity extends AbstractFooActivity 
{ 
    public void aMethodThatNeedsPrefs() 
    { 
     // ... 
     SharedPreferences myPrefs = getFooPreferences(); 
    } 
} 

Ou, Si, comme moi, vous préférez ne pas jouer avec la hiérarchie des classes, vous pouvez simplement créer une valeur constante commune pour le groupe d'activités qui doit accéder aux préférences. Ceci est utile lorsque vous avez une classe en dehors de la hiérarchie Activity qui doit accéder aux préférences. Par exemple, un Service.

public final class FooConstants 
{ 
    public static final String FOO_PREFS_NAME = "FooPrefs"; 
} 

public class AFooActivity extends Activity 
{ 
    public void aMethodThatNeedsPrefs() 
    { 
     // ... 
     SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE); 
    } 
} 

public class AFooService extends Service 
{ 
    public void aMethodThatNeedsPrefs() 
    { 
     // ... 
     SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE); 
    } 
} 

La deuxième méthode est un peu moins encapsulées, mais met moins de restrictions sur la hiérarchie des objets, ce qui est un bon compromis entre à mon avis.

+0

, il semble donc que je ne peux pas utiliser SharedPreferences sans étendre l'activité ou la mise en œuvre de l'interface. Semble ridicule que j'ai besoin de créer une sous-activité juste pour utiliser SharedPreferences. Bonne info cependant! – user432209

Questions connexes