Java Android-与两个类共享首选项

Java Android-与两个类共享首选项,java,android,sharedpreferences,Java,Android,Sharedpreferences,基本上,我想设置一个类,让设备具有getter和setter来存储和检索数据,并设置其他类来访问数据。我设法让SharedReferences在一个类中工作,但在两个类中遇到了问题(我熟悉Java,但不熟悉Android,我在某个地方读到过,我不应该使用活动,而应该使用静态,而且也不能使用它)。无论如何,这里是getter/setter类 public class Storage extends Activity { @Override public void onCreate(Bundle

基本上,我想设置一个类,让设备具有getter和setter来存储和检索数据,并设置其他类来访问数据。我设法让SharedReferences在一个类中工作,但在两个类中遇到了问题(我熟悉Java,但不熟悉Android,我在某个地方读到过,我不应该使用活动,而应该使用静态,而且也不能使用它)。无论如何,这里是getter/setter类

public class Storage extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

final SharedPreferences prefs = this.getSharedPreferences(
        "uk.co.kenreid.examplestory", Context.MODE_PRIVATE);

String nameKey = "uk.co.kenreid.examplestory.name";
我在另一个类中使用这些代码片段访问它(final用作onclicklistener中使用的变量“storage”):

试着这样做:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());

mVariable = sharedPref.getBoolean(SettingsActivity.KEY_TO_VARIABLE, false);
试试这个:

SharedPreferences prefs = this.getSharedPreferences("uk.co.kenreid.examplestory", Context.MODE_MULTI_PROCESS);
查阅


这里的第一个参数是存储数据的共享首选项的名称m。因此,您需要在每个类中使用相同的名称来访问相同的共享首选项。

在共享首选项中存储内容:

    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);  
    Editor ed = prefs.edit();  
    ed.putString(key, value);  
    ed.commit(); 
    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);
    prefs.getString(key, null);
在您的例子中,可以在onCreate方法中使用上述代码

正在从共享首选项获取内容:

    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);  
    Editor ed = prefs.edit();  
    ed.putString(key, value);  
    ed.commit(); 
    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);
    prefs.getString(key, null);
试试这个:

public class Storage extends Application

应用程序是一个用于共享活动数据的类

我认为您的问题是初始化
共享引用
远离
活动

假设这是您的问题,您可以通过
存储
类的构造函数传递
上下文来初始化它

例如

然后通过原始acessor方法访问。最好将
应用程序上下文
t而不是
活动上下文
传递给构造函数,因此在创建存储类时,在活动中这样调用它:

Storage myStorage = new Storage(getApplicationContext());

最好也创建一个单例类,以便使用相同的存储实例。网络上有很多关于Java中单身汉的教程。

你可以使用一个单独的类来处理你的所有偏好

public class PreferenceManager {
    public static void setLogInSuceess(boolean login, Context context) {
        SharedPreferences preferences;
        preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE);

        preferences.edit().putBoolean("LOGIN", login).commit();
    }

    public static boolean getLogInSuceess(Context context){
        SharedPreferences preferences;
        preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE);
        boolean login = preferences.getBoolean("LOGIN", false);

        return login;
    }
}
无论你想在哪里使用它

PreferenceManager.setLoginsUse(真/假,上下文);
boolean _login=PreferenceManager.getloginsuess(上下文)

为回应喝彩,但这次运气不好。仍在获取以下错误:致命异常:main。。。。无法启动activity ComponentInfo(uk.co.kenreid.examplestory/uk.co.uk.kenreid.examplestory.start):hava.lang.NullPointerException欢迎回复。我在getActivity()上遇到一个错误,说它对于类型存储(类名)是未定义的。欢迎回答,但我在理论上可以做到这一点(正如我提到的,我在一个类中得到了它,具体来说就是参数传递/启动活动/使用静态上下文我遇到了麻烦)。明白了。如果启动存储活动只是为了访问共享首选项数据,则不需要这样做。您可以通过传递上下文在活动外部访问它。其次,你开始活动的方式是错误的。要启动活动实例,请执行以下操作:Intent Intent=new Intent(context,Storage.class);星触觉(意图)。注意:如果您是从非活动类启动活动,则必须向该类传递一个上下文,然后可以这样启动它:context.startActivity(intent);Sayed-谢谢你帮助我,你说的第一点是正确的,但实际上有人用我使用的代码写下了这一部分,并解决了这个问题,但我想亲自感谢你的帮助,并给你投票。干杯。你能评论一下你的评价吗?我在FacebookSDK的精彩示例中看到了类应用程序,我认为它用于共享来自不同活动的数据。