Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中访问存储类中的应用程序上下文_Android_Preferences - Fatal编程技术网

在Android中访问存储类中的应用程序上下文

在Android中访问存储类中的应用程序上下文,android,preferences,Android,Preferences,我在安卓4.0上有一个应用程序。它使用PreferenceManager类让用户指定要显示的数字的小数位数 mPreferences = PreferenceManager.getDefaultSharedPreferences(this); 通常,我在获取应用程序上下文以访问首选项管理器方面没有问题。我的问题是我有一个类(我们称之为Record),它没有子类化任何具有应用程序上下文的东西;它只是一个存储类,但它确实有一个字段“NumDecPlaces”。现在,当我从我的应用程序中实例化这个类

我在安卓4.0上有一个应用程序。它使用PreferenceManager类让用户指定要显示的数字的小数位数

mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
通常,我在获取应用程序上下文以访问首选项管理器方面没有问题。我的问题是我有一个类(我们称之为Record),它没有子类化任何具有应用程序上下文的东西;它只是一个存储类,但它确实有一个字段“NumDecPlaces”。现在,当我从我的应用程序中实例化这个类时,我只需要传入用户的#dec places首选项。如果Record可以直接访问首选项管理器,那就太好了。我想我总是可以用一个指向创建记录的上下文的指针来实例化记录,但这需要记住很多;-)

所以现在记录子类什么都没有。我可以对它做些什么来允许它查看应用程序上下文,有什么建议吗


谢谢

可以在构造函数中传递
上下文
对象。因此,每当您尝试使用该类时,它都会要求您传递一个
上下文
对象,然后使用该对象获取
共享引用

例如

public Record(Context context)
{
  mContext = context;

  mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext)
}

您可以执行@Apoorv的建议,也可以创建另一个专门存储应用程序上下文的类

public class ContextResolver {

    private static Context context;

    public static void setContext(Context context) {
        if (context == null) {
            throw new IllegalArgumentException("Context must not be null");
        } else if (context instanceof android.app.Activity) {
            context = androidContext.getApplicationContext();
        } else if (context instanceof android.content.Context) {
            context = androidContext;
        }
    }
    public Context getContext() {
       return context;
    }
}
现在,您需要在第一个活动中调用setContext(),该活动将启动一次

public class MyFirstActivity extends Activity {
    public void onCreate() {
         ContextResolver.setContext(this);
    }
}
现在,您可以从代码的任何部分检索上下文。所以在你的唱片课上,你可以这样做:

mPreferences = PreferenceManager.getDefaultSharedPreferences(ContextResolver.getContext());

您还可以使用Application扩展一个类,该类对整个应用程序是全局的,您可以将该类中的上下文设置为成员变量,并且该上下文对整个应用程序是全局的


A级扩展应用程序{……}

耶,这是我对这个问题的第一反应。正如我提到的,我只是试图避免用上下文进行实例化时必须“记住”。这其实没什么大不了的,在Android开发的其他地方几乎都会发生,所以我不知道为什么我会犹豫。是的,你要么需要传递
上下文
对象,要么传递构造函数中的
共享引用
对象……我真的对额外的工作抱怨太多了。Eclipse非常善于提醒我。这很有趣。今晚我将尝试一下,并将其与上下文中的just-pass-in-a-context选项进行权衡。