2013-10-07 151 views
0

基本上我想设置一个类来让getter和setter对设备存储和检索数据以及其他类来访问它。我设法让sharedpreferences在一个类中工作,但在两个类中遇到问题(我熟悉Java但不熟悉Android,我在某处阅读我不应该使用Activity而是使用静态方法,但无法使其工作)。无论如何,这里是getter/setter类。Android - 两个类的共享首选项

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"; 

我与这些代码段中的其他类访问它(最终被用作变量“存储”是一种onclicklistener内使用):

final Storage storage = new Storage(); 

storage.storeItem("name", name); 
System.out.println(storage.getString("name")); 

回答

1

我相信你的问题是初始化的SharedPreferences类远离Activity

假设这是你的问题,你可以传递Context通过Storage类的构造函数来初始化它。

例如,

SharedPreferences prefs; 

public Storage(Context aContext){ 
    prefs = aContext.getSharedPreferences("uk.co.kenreid.examplestory", 
      Context.MODE_PRIVATE); 
} 

然后通过您原始的acessor方法访问。也许是最好的通过传递Application Contex吨而非Activity Context的构造函数,所以当你创建你的存储类,这样称呼它的活动:

Storage myStorage = new Storage(getApplicationContext()); 

这也许是明智的创建辛格尔顿类以及允许您使用相同的存储实例。网上有很多关于Java中的单身人士的教程。

+0

Biddulph.r - 非常感谢,修复它。 –

0

尝试这样的:

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

mVariable = sharedPref.getBoolean(SettingsActivity.KEY_TO_VARIABLE, false); 
+0

欢呼声回复。我在getActivity()上发现错误,说它对于类型Storage(类名)是未定义的。 –

1

试试这个:

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

干杯的回应,但没有运气与此。仍然收到以下错误: 致命异常:main ....无法启动活动ComponentInfo(uk.co.kenreid.examplestory/uk.co.uk.kenreid.examplestory.start):hava.lang.NullPointerException –

0

检查文档getSharedPreferences

这里第一个参数是存储数据的共享首选项的名称。因此,您需要使用每个班级的相同名称来访问相同的共享偏好设置。

1

存储在共享偏好的东西:

SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE); 
    Editor ed = prefs.edit(); 
    ed.putString(key, value); 
    ed.commit(); 

你的情况,你可以使用上面的代码onCreate方法内。

撷取来自共享偏好的东西:

SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE); 
    prefs.getString(key, null); 
+0

干杯对于答复,但我有理论上的工作(正如我所提到的,我在一个类中工作,它特别是参数传递/启动活动/使用静态上下文,我有麻烦)。 –

+1

好吧。如果您只是为了访问共享首选项数据而开始存储活动,那么您不需要。您只需传递上下文即可在活动之外访问它。其次,你开始错误的方式。要启动活动实例,请执行以下操作:Intent intent = new Intent(context,Storage.class); startActivity(意向)。注意:如果您从非活动类开始活动,则必须将该上下文传递给该类,然后可以像这样启动它:context.startActivity(intent); –

+0

说过了 - 谢谢你帮助我,你对第一个观点是正确的,但其他人实际上是用我使用的代码写出了这部分内容,并解决了问题,但我想亲自谢谢你的帮助,并给你一个投票。干杯。 –

-1

试试这个:

public class Storage extends Application 

应用是用来分享活动数据

+0

你可以评论你的评估吗?我在Facebook SDK的Scrumptious示例中看到类Application,在我看来,它用于共享来自不同Activity的数据。 –

0

您可以使用一个单独的类可以处理所有的喜好

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.setLogInSuceess(真/假,背景); 布尔_login = PreferenceManager.getLogInSuceess(上下文);