【问题标题】:Getting "cannot resolve method" error when trying to implement getSharedPreferences in Android Studio尝试在 Android Studio 中实现 getSharedPreferences 时出现“无法解析方法”错误
【发布时间】:2014-06-14 15:18:38
【问题描述】:

我正在尝试创建一个 KeyValueDB 类,它存储与 SharedPreferences 交互的方法,但是我在定义类时遇到了问题。我想要构造函数做的就是用正确的文件名存储一个 sharedPreferences 对象,但我得到一个“无法解析方法'getSharedPreferences(java.lang.String,int)'

我正在传递一个字符串和一个整数......我不确定我做错了什么。感谢任何帮助!

package com.farmsoft.lunchguru.utils;

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

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.json.JSONException;

/**
 * Created by sxs on 4/28/2014.
 */
public class KeyValueDB {
    private SharedPreferences sharedPreferences;

    public KeyValueDB(String prefName) {
        sharedPreferences = getSharedPreferences(prefName, Context.MODE_PRIVATE);
    }

【问题讨论】:

标签: java android sharedpreferences


【解决方案1】:

你应该在那里传递一个上下文......

获取字符串值示例:

public static String getUserName(Context ctx)
{
    return getSharedPreferences(ctx).getString(PREF_USER_NAME, "");
}

其中PREF_USER_NAME是键,第二个参数是当找不到键时返回""

【讨论】:

    【解决方案2】:

    getSharedPreferences() 需要访问上下文。

    例如:

    mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    

    您需要将上下文传递给 KeyValueDB 的构造函数,或者更好的方法是静态访问它。

    我会这样做

    public class KeyValueDB {
    private SharedPreferences sharedPreferences;
    private static String PREF_NAME = "prefs";
    
        public KeyValueDB() {
        // Blank
        }
    
        private static SharedPreferences getPrefs(Context context) {
            return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        }
    
        public static String getUsername(Context context) {
            return getPrefs(context).getString("username_key", "default_username");
        }
    
        public static void setUsername(Context context, String input) {
            SharedPreferences.Editor editor = getPrefs(context).edit();
        editor.putString("username_key", input);
        editor.commit();
        }
    }
    

    只需对您需要存储的任何信息重复这些 get 和 set 方法即可。

    要从 Activity 访问它们,您可以这样做:

    String username = KeyValueDB.getUsername(this);
    

    其中“this”是对 Activity 的引用。在 onCreate() 方法中为每个 Activity 设置上下文也是一种很好的做法,例如:

    public class myActivity extends Activity{
    
    Context mContext;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    
        String username = KeyValueDB.getUsername(mContext);
    }
    

    2016 年 7 月编辑

    响应下面的@RishirajPurohit,设置用户名你做同样的事情:

    KeyValueDB.setUsername(mContext, "DesiredUsername");
    

    在前面的静态类中为您完成了所有工作,更改被提交到共享首选项文件并被持久化并准备好被 get 方法检索。

    只是一个关于 get 方法的注释,以防有人想知道:

    public static String getUsername(Context context) {
        return getPrefs(context).getString("username_key", "default_username");
    }
    

    "default_username" 与听起来完全一样。如果在设置用户名之前首先调用该 get 方法,则该值就是返回的值。在这种情况下不太有用,但是当您开始使用整数和布尔值时,这对于确保稳健性非常有用。

    【讨论】:

    • 谢谢!这是一个很好的综合答案
    • @Kryten2k35 你的回复很干净而且很有帮助。谢谢。
    • 什么时候我想设置用户名?就像做对一样?
    • @RishirajPurohit 是的,您只需执行 KeyValueDB.setUsername(mContext, "DesiredUsername");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多