0

我的应用中有一些活动,我想利用共享偏好。最初,我在每个活动中创建了一个方法来利用 SharedPreferences,它运行良好。但是,由于有多个活动使用相同的数据,所以我基本上将类似的方法放在多个地方。因此,为了处理所有这些方法而专门创建一个类似乎更有意义。

不幸的是,我不明白如何正确地做到这一点。

这不会编译,因为它说“getSharedPreferences 未为 AppPrefs 类型定义。”</p>

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);
 } 
}

在这里做什么有意义?我错过了一个概念吗?谁能详细说明和解释?谢谢。

4

2 回答 2

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);
    }
}

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

于 2010-10-26T14:07:11.260 回答
1

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

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

现在只需this从活动类传入foo()

于 2010-10-26T18:57:38.897 回答