Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Java Android-在单独的类中使用共享首选项?_Java_Android_Android Intent_Android Activity - Fatal编程技术网

Java Android-在单独的类中使用共享首选项?

Java Android-在单独的类中使用共享首选项?,java,android,android-intent,android-activity,Java,Android,Android Intent,Android Activity,我想在android中使用共享首选项保存数据。但我希望使用单独的类来完成此任务。我已经实现了这个类,如下所示 import android.content.Context; import android.content.SharedPreferences; public class SavePref { private Context context; public SavePref(Context context){ this.context = cont

我想在android中使用共享首选项保存数据。但我希望使用单独的类来完成此任务。我已经实现了这个类,如下所示

import android.content.Context;
import android.content.SharedPreferences;

public class SavePref {

    private Context context;

    public SavePref(Context context){
        this.context = context;
    }

    public void saveInt(String key, int value) {

        SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(key, value);
        editor.commit();

    }

}
但是
getActivity()
上有一个错误

如何解决这个问题?
谢谢你的改变

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

您已经有了上下文,那么为什么要使用
getActivity()

实际上
getActivity()
用于获取
Fragment
中的上下文
getActivity()
Fragment
的一种方法,而不是
SavePref
。在您的情况下,简单的解决方法是使用您作为成员变量保留的上下文来检索
SharedReferences
。另一种方法是避免将上下文保留为成员变量,以某种方式将共享首选项链接到
SavePref
类的实例,并使用静态方法

  public static void saveInt(Context context, String key, int value) {
        SharedPreferences sharedPref = context.getDefaultSharedPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(key, value);
        editor.commit();
    }
并对该方法进行如下处理:

SavePref.saveInt(getActivity(), key, value);
片段

SavePref.saveInt(this, key, value);

活动
。这样,您就不必在每次需要调用
saveInt
时都实例化SavePref,并且可以避免存储对
上下文的引用

我创建了一个类来做同样的事情。通过这种方式,您可以保存布尔值、整数、字符串数据,或者检查数据是否已保存在应用程序的特定首选项组中

因此,您需要创建一个类“DataProcessor.java”,并将内容放在下面。我还将留下一些关于如何使用它的例子

我希望它能帮助你

import android.content.Context;
import android.content.SharedPreferences;

public class DataProccessor {

    private static Context context;

    public DataProccessor(Context context){
        this.context = context;
    }

    public final static String PREFS_NAME = "appname_prefs";

    public boolean sharedPreferenceExist(String key)
    {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        if(!prefs.contains(key)){
            return true;
        }
        else {
            return false;
        }
    }

    public static void setInt( String key, int value) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt(key, value);
        editor.apply();
    }

    public static int getInt(String key) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        return prefs.getInt(key, 0);
    }

    public static void setStr(String key, String value) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(key, value);
        editor.apply();
    }

    public static String getStr(String key) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        return prefs.getString(key,"DNF");
    }

    public static void setBool(String key, boolean value) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean(key, value);
        editor.apply();
    }

    public static boolean getBool(String key) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        return prefs.getBoolean(key,false);
    }
}
为了使用它,我将向您展示一些关于如何保存字符串值的小示例,以备在活动、片段或服务中使用

对于活动

 //// To Save a value
 DataProccessor dataProccessor = new DataProccessor(this);
 dataProccessor.setStr("email","johndoe@mail.com");

 //// To Retreive a value
 dataProccessor.getStr("email");
对于片段

 //// To Save a value
 DataProccessor dataProccessor = new DataProccessor(getActivity());
 dataProccessor.setStr("email","johndoe@mail.com");

 //// To Retreive a value
 dataProccessor.getStr("email");
对于服务

 //// To Save a value
 DataProccessor dataProccessor = new DataProccessor(getApplicationContext());
 dataProccessor.setStr("email","johndoe@mail.com");

 //// To Retreive a value
 dataProccessor.getStr("email");

您可以在项目中简单地创建seprate常量类,并在需要保存或检索数据时以非常简单的方式调用它

class Constant {

    companion object {

        val loginData: String = "LoginData"
        val token: String = "token"
        //create the fuction of shared prefrence
        fun setpref(context: Context): SharedPreferences {
            return context.getSharedPreferences("Table Data", Context.MODE_PRIVATE)

        }
    }
}

不要将Android上下文类放在静态字段中;这是一个内存泄漏(也破坏了即时运行)@jeprubio我创建了一个单独的类,你可以在任何地方访问它,我知道你的意思,但是任何用户都必须以他们想要的方式管理他们的内存使用
 //// To Save a value
 DataProccessor dataProccessor = new DataProccessor(getApplicationContext());
 dataProccessor.setStr("email","johndoe@mail.com");

 //// To Retreive a value
 dataProccessor.getStr("email");
class Constant {

    companion object {

        val loginData: String = "LoginData"
        val token: String = "token"
        //create the fuction of shared prefrence
        fun setpref(context: Context): SharedPreferences {
            return context.getSharedPreferences("Table Data", Context.MODE_PRIVATE)

        }
    }
}
  class PreferenceUtil { 
    
     private var msharedPref: SharedPreferences? = null
     private var mEditor: Editor? = null
    
     companion object {
     private var sInstance: PreferenceUtils? = null
    
     fun getInstance(context: Context): PreferenceUtils {
                if (sInstance == null) {
                    sInstance = PreferenceUtils(context)
                }
                return sInstance as PreferenceUtils
            }
    }
    
     constructor()
    
        constructor(mContext: Context?) {
            msharedPref = mContext?.getSharedPreferences(APP_PREF, MODE_PRIVATE)
            mEditor = mSettings?.edit()
        }
        // get Boolean value
         fun getValue(key: String, defValue: Boolean): Boolean {
        return msharedPref!!.getBoolean(key, defValue)
    }
    // set Boolean value
    fun setValue(key: String, value: Boolean) {
        mEditor!!.putBoolean(key, value)
        mEditor!!.apply()
    }
 }


// Initialize the Pref class in your required class

class Abc : AppCompatActivity() {
   var mPreferenceUtil: PreferenceUtil = PreferenceUtils(this)

   mPreferenceUtil.setValue(ABC_POPUP, false)
}
package com.app.luandryuser.Util;

import android.content.Context;
import android.content.SharedPreferences;

public class DataStorage {



    public static final int INTEGER = 1;
    public static final int FLOAT = 2;
    public static final int LONG = 3;
    public static final int STRING = 4;
    public static final int BOOLEAN = 5;
    private Context ctx;
    private SharedPreferences pref;
    private SharedPreferences.Editor writer;

    public DataStorage(Context ctx) {
        this.ctx = ctx;
        pref = ctx.getSharedPreferences("rural", Context.MODE_PRIVATE);
        writer = pref.edit();
    }

    public void write(String key, int value) {
        writer.putInt(key, value);
        writer.commit();
    }

    public void write(String key, float value) {
        writer.putFloat(key, value);
        writer.commit();
    }

    public void write(String key, String value) {
        writer.putString(key, value);
        writer.commit();
    }

    public void write(String key, boolean value) {
        writer.putBoolean(key, value);
        writer.commit();
    }

    public void write(String key, long value) {
        writer.putLong(key, value);
        writer.commit();
    }

    public Object read(String key, int DataType) {
        Object response = new Object();
        if (DataType == INTEGER)
            response = pref.getInt(key, 0);
        else if (DataType == BOOLEAN)
            response = pref.getBoolean(key, false);
        else if (DataType == LONG)
            response = pref.getLong(key, 0);
        else if (DataType == STRING)
            response = pref.getString(key, "");
        else
            response = pref.getFloat(key, 0.0f);
        return response;
    }
}