【问题标题】:Android - Shared Preference with Two ClassesAndroid - 两个类的共享偏好
【发布时间】:2013-10-07 13:35:41
【问题描述】:

基本上,我想设置一个类来让设备具有 getter 和 setter 来存储和检索数据,以及其他类来访问它。我设法让 sharedpreferences 在一个类中工作,但在两个类中遇到问题(我熟悉 Java 但不熟悉 Android,我在某个地方读到我不应该使用 Activity 而是静态的,也无法让它工作)。无论如何,这里是 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 用作变量“storage”,在 onclicklistener 中使用):

final Storage storage = new Storage();

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

【问题讨论】:

    标签: java android sharedpreferences


    【解决方案1】:

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

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

    例如。

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

    然后通过您原来的访问方法访问。最好将 Application Context 而不是 Activity Context 传递给构造函数,因此当您创建 Storage 类时,请在 Activity 中像这样调用它:

    Storage myStorage = new Storage(getApplicationContext());
    

    创建一个 Singleton 类也是明智之举,以允许您使用相同的 Storage 实例。网络上有大量的 Java 单例教程。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

      • 为响应欢呼,但没有运气。仍然收到以下错误: FATAL EXCEPTION: main .... Unable to start activity ComponentInfo(uk.co.kenreid.examplestory/uk.co.uk.kenreid.examplestory.start): hava.lang.NullPointerException
      【解决方案3】:

      在共享偏好中存储一些东西:

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

      【讨论】:

      • 为回复干杯,但我在理论上有这个工作(正如我提到的,我在一个类中工作,特别是参数传递/启动活动/使用我遇到问题的静态上下文) .
      • 好的,知道了。如果您开始存储活动只是为了访问共享首选项数据,那么您不需要这样做。您可以通过传递上下文在活动之外访问它。其次,您以错误的方式开始活动。要启动一个活动实例,请执行以下操作: Intent intent = new Intent(context, Storage.class);开始活动(意图)。注意:如果您从非活动类开始活动,则必须将上下文传递给该类,然后您可以像这样启动它: context.startActivity(intent);
      • 说 - 谢谢你帮助我,你的第一点是正确的,但实际上其他人用我使用并修复了问题的代码写出了那部分,但我想亲自感谢你帮助也给你投票。干杯。
      【解决方案4】:

      试试这样:

      SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
      
      mVariable = sharedPref.getBoolean(SettingsActivity.KEY_TO_VARIABLE, false);
      

      【讨论】:

      • 为回复干杯。我在 getActivity() 上收到一个错误,说它未定义类型 Storage(类名)。
      【解决方案5】:

      查看getSharedPreferences的文档

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

      【讨论】:

        【解决方案6】:

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

        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(true/false, context); boolean _login = PreferenceManager.getLogInSuceess(context);

        【讨论】:

          【解决方案7】:

          试试这个:

          public class Storage extends Application
          

          Application 是一个用于从活动共享数据的类

          【讨论】:

          • 您可以评论您的评价吗?我在 Facebook SDK 的 Scrumptious 示例中看到了 Application 类,我认为该类用于共享来自不同 Activity 的数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-17
          • 2019-06-20
          • 2012-10-24
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多