繁体   English   中英

如何创建专门用于使用SharedPreferences的类?

[英]How do I create a class specifically for the purpose of using SharedPreferences?

我的应用程序中有一些活动,希望利用共享的首选项。 最初,我在每个活动中创建了一个方法来使用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);
 } 
}

这里有什么意义吗? 我错过了一个概念吗? 任何人都可以详细说明吗? 谢谢。

如果首选项对应用程序是全局的,则可以使用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);
    }
}

第二种方法的封装稍微少一些,但对对象层次结构的限制较少,这在我看来是一个很好的权衡。

将您的上下文传递到您的偏好获取器中。

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

现在只需将this从活动类传递给foo()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM