使用getSharedPreferences android?

use*_*938 -2 android sharedpreferences

这是save()我的应用程序中的方法:

public void save() {
    Context context;
    SharedPreferences sp = context.getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}
Run Code Online (Sandbox Code Playgroud)

我一直试图让它工作一段时间,但这getSharedPreferences (String name, int mode)对我来说并没有起作用.它不会出现在它自己的context.getSharedPreferences()工作上,但是NullPointerException由于我的背景,我认为这会产生一个.我已经尝试save(Context context){}过构造函数,但是从该方法内部声明的上下文的另一个方法调用它也不起作用.我看了很多例子,但没有一个能为我效劳.那我怎么getSharedPreferences()去上班?

编辑:我有一个类GameScreen和一个类SaveManager.当我在Gamescreen中保存时,这是我使用的代码:

Savemanager savemanager;
savemanager.save();
state = GameState.Running;
Run Code Online (Sandbox Code Playgroud)

我有我的类SaveManager:

package com.package.game;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;

public class SaveManager extends Activity {

private Player player = GameScreen.getPlayer();

public void save() {
    SharedPreferences sp = getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
}
}
Run Code Online (Sandbox Code Playgroud)

当我在GameScreen中保存时,我的应用程序崩溃了,我得到了这个logcat:

02-20 01:39:31.979: E/AndroidRuntime(1368): FATAL EXCEPTION: Thread-119
02-20 01:39:31.979: E/AndroidRuntime(1368): java.lang.NullPointerException
02-20 01:39:31.979: E/AndroidRuntime(1368): at com.package.game.GameScreen.updateLevelUp(GameScreen.java:364)
Run Code Online (Sandbox Code Playgroud)

线364是线savemanager.save();.我不知道为什么会崩溃我的应用程序.

A--*_*--C 6

getSharedPreferences()是一种Context方法.如果save()在一个扩展的类中Context,例如Activity,您不必这样做context.getSharedPreferences(),那么您可以这样做,因为您将其作为"单独的方法".

但是,如果save 不在扩展的类中Context,为了能够调用getSharedPreferences(),它需要Context传递一个变量.这意味着你通过简单地创建一个context变量所做的事情是不够的(并且该代码不应该编译,将会抛出关于如何context未初始化变量的错误).由于Contexts不是使用构造函数创建的,因此您的方法会遇到死胡同.

但是,你很亲密.为了便于说明,您可以创建一个在a中接受Context并执行保存的静态方法.static因为这个方法真的不需要对象实例,所以它可以是自包含的:

public static void save(Context context) {

    if (context == null)
      throw new RuntimeException ("Context is null, what are you doing?");

    SharedPreferences sp = context.getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果此方法是类的一部分,例如named StaticUtils,则可以调用save:

  • 通过Activity:StaticUtils.save(YourActivityClass.this);StaticUtils.save(this);取决于范围(例如,如果在匿名内部函数内部,您将使用YourActivityClass.this).
  • Fragment: StaticUtils.save(getActivity());
  • BroadcastReceiver: StaticUtils.save(context);
  • A View(例如,View传递时onClick()被称为:StaticUtils.save(v.getContext());

请记住,您可以在活动中保存的最敏捷的事情是onCreate()在失败之前的任何事情,并且例外应该清楚地表明.

一个简单的演示.没有扩展任何东西,没有花哨的制作Context:

MainActivity.java:

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     StaticUtils.save(this);

     SharedPreferences prefs = getSharedPreferences ("gameSave", Context.MODE_PRIVATE);
     System.out.println ("X is " + prefs.getInt ("X",-1));
  }
}
Run Code Online (Sandbox Code Playgroud)

StaticUtils.java

public class StaticUtils {
    public static void save(Context context) {

        if (context == null)
          throw new RuntimeException ("Context is null, what are you doing?");

        SharedPreferences sp = context.getSharedPreferences("gameSave",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        editor.putInt("X", 11);
        editor.putInt("Y", 24);
        editor.putInt("level", 3);
        editor.putFloat("xp", 100);
        editor.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)