-2

これは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();
}

私はこれをしばらくの間機能させようとしてきましたが、うまくいきgetSharedPreferences (String name, int mode)ませんでした。それはそれ自体では発生しませんが、context.getSharedPreferences()動作しますが、それは をもたらしNullPointerExceptionます。私の文脈のせいだと思います。私はコンストラクターとして試しsave(Context context){}ましたが、そのメソッド内で宣言されたコンテキストを持つ別のメソッドからそれを呼び出しても機能しません。多くの例を見てきましたが、どれもうまくいきませんでした。では、どうすれば仕事に就くことができるgetSharedPreferences()でしょうか?

編集:クラス GameScreen とクラス SaveManager があります。Gamescreen に保存するときは、次のコードを使用します。

Savemanager savemanager;
savemanager.save();
state = GameState.Running;

そして、クラス 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());
}
}

そして、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)

364行目は行savemanager.save();です。これが私のアプリをクラッシュさせる理由がわかりません。

4

1 に答える 1

6

getSharedPreferences()Context方法です。のようにsave()を拡張するクラスであれば、 をしなくてもよいので、「メソッドそのもの」と言えます。ContextActivitycontext.getSharedPreferences()

ただし、 saveがを拡張するクラスにないContext場合、 を呼び出すことができるようにするには、変数を渡すgetSharedPreferences()必要があります。Contextこれは、単純にcontext変数を作成するだけでは不十分であることを意味します (そのコードはコンパイルされるべきではありませcontextん。変数が初期化されていない方法についてエラーがスローされます)。s はコンストラクターを使用して作成されていないためContext、メソッドは行き止まりになります。

しかし、あなたは近くにいます。Context説明のために、 a を受け入れて保存を行う静的メソッドを作成できます。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();
}

このメソッドが という名前のクラスの一部である場合、StaticUtilssave を呼び出すことができます。

  • Activity:を介して、StaticUtils.save(YourActivityClass.this);またはStaticUtils.save(this);スコープに応じて (たとえば、匿名の内部関数内の場合は、 を使用しますYourActivityClass.this)。
  • Fragment:StaticUtils.save(getActivity());
  • BroadcastReceiver:StaticUtils.save(context);
  • A View(たとえばView渡された whenonClick()が呼び出された場合: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));
  }
}

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();
    }
}
于 2013-02-20T00:06:55.817 に答える