【问题标题】:Should I define SharedPreferences in the MainActivity?我应该在 MainActivity 中定义 SharedPreferences 吗?
【发布时间】:2017-06-22 06:18:00
【问题描述】:

我有四个ActivitiesMainActivityHomeActivitySecondActivityThirdActivity

我使用MainActivity 作为欢迎屏幕,我的应用从 HomeActivity 开始。我在HomeActivity 中定义了我的SharedPreferences

OnCreate 方法外

SharedPreferences settings;
SharedPreferences.Editor editor;

还有OnCreate

settings = getSharedPreferences("app_settings", Context.MODE_APPEND);
editor = settings.edit();

我的问题是我的SharedPreferences 仅适用于HomeActivity。 我也想在SecondActivity 中打电话给我的sharedPreferences

我该怎么办?

【问题讨论】:

  • 试试this
  • 它只返回与给定名称对应的SharedPreferences 的对象。您可以在任何活动中访问它。所以你只需要在 ANother Activity 的 OnCreate 上添加相同的语句即可。
  • 只需使用PreferenceManager.getDefaultSharedPreferences(this),您可以在任何活动中调用它来访问相同的共享首选项。
  • 声明一个针对 SharedPreferences 的单例类并在项目的任何地方使用它

标签: java android android-activity sharedpreferences


【解决方案1】:

您可以像这样使用 SharedPreferences 实现单例

public class SPManager {

    private static final String TAG = SPManager.class.getName();

    private static SPManager instance;

    private Context mContext;
    private SharedPreferences mPrefs;


    private static final String PREF_NAME = "com.package.app";

    private static final String KEY_NAME = "user_name";


    public static SPManager getInstance(Context context) {
        if (instance == null) {
            instance = new SPManager(context);
        }
        return instance;
    }

    private SPManager(Context context) {
        mContext = context;
        mPrefs = mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }


//    Example
    public void addName(String name) {
        mPrefs.edit().putString(KEY_NAME, name).apply();
    }

    public String getName() {
        return mPrefs.getString(KEY_NAME, "John Doe");
    }
}

你也可以像这样使用这个单例:SPManager.getInstance(context).getName();

使用和更新都很简单。

希望能帮到你。

【讨论】:

    【解决方案2】:

    请创建一个像 Datastorage 这样的类

    import android.content.Context;
    import android.content.SharedPreferences;
    
    public class Datastorage
    {
    public static final int INTEGER_KEY = 1;
    public static final int STRING_KEY = 2;
    public static final int FLOAT_KEY = 3;
    
    public static void WritePreference(String key, String value , Context ctx)
    {
        SharedPreferences sp= ctx.getSharedPreferences("GLOBAL", Context.MODE_PRIVATE);
        SharedPreferences.Editor writer = sp.edit();
        writer.putString(key, value);
        writer.commit();
    }
    public static void WritePreference(String key, int value , Context ctx)
    {
        SharedPreferences sp= ctx.getSharedPreferences("GLOBAL", Context.MODE_PRIVATE);
        SharedPreferences.Editor writer = sp.edit();
        writer.putInt(key, value);
        writer.commit();
    }
    public static void WritePreference(String key, float value , Context ctx)
    {
        SharedPreferences sp= ctx.getSharedPreferences("GLOBAL", Context.MODE_PRIVATE);
        SharedPreferences.Editor writer = sp.edit();
        writer.putFloat(key, value);
        writer.commit();
    }
    
    public static Object ReadFromPreference(String key , int type , Context ctx)
    {
        SharedPreferences sp= ctx.getSharedPreferences("GLOBAL", Context.MODE_PRIVATE);
    
        Object temp = null;
        if(sp.contains(key)== true)
        {
            if (type == Datastorage.STRING_KEY)
                temp= sp.getString(key,"");
            else if (type == Datastorage.INTEGER_KEY)
                temp = sp.getInt(key,0);
            else if (type == Datastorage.FLOAT_KEY) {
                temp = sp.getFloat(key, 1.0f);
            }
    
        }
        else
            return temp;
        return  temp;
      }
    
    }
    

    在你在应用程序中的每个地方都使用过这个类之后,

    在我的 login.java 类中,我将 id 存储在 sharedpreferences 中,例如

    Datastorage.WritePreference("id",idvalue, getApplicationContext());
    

    在 home.java 之后,我像这样读取这个 id 值,

    String id  = (String) Datastorage.ReadFromPreference("id",Datastorage.STRING_KEY,getApplicationContext());
    

    【讨论】:

    • 此代码在命名方法时不遵循关于驼峰式大小写的 Java 约定。此外,您应该避免使用此类静态方法,因为它难以测试。如果你需要实现一个Singleton 做好,不要这样做
    【解决方案3】:

    创建 1 个名为 BaseActivity 的扩展类

    class BaseActivity{
         SharedPreferences settings;
         SharedPreferences.Editor editor;
    
         onCreate(){
             settings = getSharedPreferences("app_settings", Context.MODE_APPEND);
             editor = settings.edit();
         }
    }
    

    然后,在任何活动中扩展它.. 例如:SecondActivity 扩展 BaseActivity

    class SecondActivity extends BaseActivity{
         onCreate(){
            editor.putString("","").apply();
         }
    }
    
    class FirstActivity extends BaseActivity{
         onCreate(){
            editor.putString("","").apply();
         }
    }
    
    .....
    

    【讨论】:

      【解决方案4】:

      只需在需要共享首选项值的任何位置调用此自定义方法

      public void retrivePreference() {
      
          SharedPreferences settings = getSharedPreferences("app_settings", Context.MODE_APPEND);
          String value1 = setting.getString("key1", null);
          String value2 = setting.getString("key2", null);
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2020-03-17
        相关资源
        最近更新 更多