我的应用中有几项活动,我想利用共享偏好设置。最初,我在每个活动中创建了一个方法来使用SharedPreferences,它运行良好。但是,由于有多个活动使用相同的数据,我基本上在多个地方隐藏类似的方法。因此,为了处理所有这些方法而创建一个类似乎更有意义。
不幸的是,我不明白如何正确地做到这一点。
这不会编译,因为它说“对于AppPrefs类型,未定义getSharedPreferences。”
public class AppPrefs {
public void foo() {
SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
}
}
最后,我想,也许因为SharedPreferences是一个接口,我可以做到这一点,但后来我必须实现继承的方法。我没有理由覆盖任何这些方法,所以也没有理由这样做。
public class AppPrefs implements SharedPreferences {
public void foo() {
SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
}
}
这里有什么意义吗?我错过了一个概念吗?任何人都可以详细说明吗?感谢。
答案 0 :(得分:1)
如果首选项是应用程序的全局,则可以在需要访问常用首选项时使用PreferenceManager.getDefaultSharedPreferences();
。如果首选项特定于Activities
的子集,则您有以下几种选择:
您可以创建一个由需要访问首选项的所有类扩展的Activity
子类:
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();
}
}
或者,如果像我一样,你宁可不要乱用类层次结构,也可以简单地为需要访问首选项的活动组创建一个公共常量值。这在您具有需要访问首选项的Activity
层次结构之外的类的情况下非常有用。例如,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);
}
}
第二种方法的封装略少,但对对象层次结构的限制较少,这在我看来是一个很好的权衡。
答案 1 :(得分:1)
将您的上下文传递到您的偏好getter。
public class AppPrefs {
public static void foo(Context ctx) {
SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0);
}
}
现在只需将this
从活动类传递到foo()