我正在通过settingshelper类在sharedpreferences中设置一个字符串,如下所示。我已经通过在字符串设置之后立即获取字符串来验证它是否已设置。
将创建SettingShelper类的新实例。
然后我尝试检索我设置的字符串,但结果为空。
getname可能返回null,因为我创建了settingshelper类的新实例?

public class SettingsHelper extends Application {

    private static Context context;
    Context ctx;

    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        ctx = context;
    }

    public static Context getAppContext() {
        return context;
    }

 public SettingsHelper() {
        this.ctx = context;
    }


 public String getName() {
        return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "null");
    }

    public void setName(String name) {
        PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit();
    }
}

活动A
SettingsHelper settingsHelper = new SettingsHelper();
settingsHelper.setName("John");

B类
SettingsHelper settingsHelper = new SettingsHelper();
    settingsHelper.getName(); //null

最佳答案

尝试将方法转换为静态方法:

public class SettingsHelper {

 public static String getName(Context ctx) {
        return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "An error occured loading name");
    }

    public static void setName(String name, Context ctx) {
        PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit();
    }
}

(从活动中)呼叫。如果是外部活动,请将其替换为上下文:
getName(this);

setName("Namey McNameface", this);

这样就不需要实例,只需要调用settingshelper.setname/getname。
编辑
记住给一个字符串赋值:
SettingsHelper settingsHelper = new SettingsHelper();
String stringHandler = settingsHelper.GetName();
//handle string

编辑2
注意!
对于这样的类,扩展应用程序不是一个好主意。删除“扩展应用程序”。
有什么关系?
类扩展活动用于必须始终运行且未以正常方式初始化的任务(类C=新类)
通过编写android:name=".MyClass",通过清单初始化扩展应用程序的类。这些类用于:
初始化和处理firebase
初始化和处理acra
初始化和处理诸如权限之类的重要事情(如果您想在启动时立即检查它们
因此,扩展应用程序的类不适用于普通类,我建议您像我上面所做的那样。另外,因为您多次创建它,所以我认为context=null也是
我编辑了上面的代码,复制后再试一次,看看是否有效

10-08 18:30