SharedPreferences возвращает ноль при получении значений - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь сохранить некоторые значения с SharedPreferences в виде пар ключ-значение, когда приложение закрывается или уничтожается, и получить их при повторном открытии приложения.Проблема в том, что когда я вызываю для получения значений, он возвращает null.

Я пытался передать контекст или получить контекст приложения и сделать значения static, но это, похоже, не работает.

class SavedValues {

private static final String keyP1fName = String.valueOf(R.string.player_1_name_key);
private static final String keyP1Game = String.valueOf(R.string.player_1_game_key);
private static final String keyP2fName = String.valueOf(R.string.player_2_sname_key);
//Have other strings here

private MainGame mainGame;

SavedValues(MainGame mainGame) {
    this.mainGame = mainGame;
}

//private SharedPreferences mPrefs = mainGame.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
private SharedPreferences mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
//SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());


void saveMainGameValues() {
    SharedPreferences.Editor editor = mPrefs.edit();
     editor.putString(keyP1fName, mainGame.fullNameP1.getText().toString());
     editor.putString(keyP1Game, mainGame.gameScoreP1.getText().toString());

     editor.putString(keyP2fName, mainGame.fullNameP2.getText().toString());
     editor.putString(keyP2Game, maingGame.gameScoreP2.getText().toString());
     editor.apply();
}

void getMainGameValues() {
    mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
    if (mPrefs.contains(keyP1fName)) {
    mainGame.fullNameP1.setText(mPrefs.getString(keyP1fName, "Player 1"));
    mainGame.gameScoreP1.setText(mPrefs.getString(keyP1Game, "0"));

    mainGame.fullNameP2.setText(mPrefs.getString(keyP2fName, "Player 2"));
    mainGame.gameScoreP2.setText(mPrefs.getString(keyP2Game, "0"));
}}
}

И я пытаюсь вызвать их в моих основных действиях onStart / onStop и т. Д.

@Override
protected void onStart() {
    //savedVals.getMainGameValues();
    super.onStart();
}

@Override
protected void onResume() {
    savedVals.getMainGameValues();
    super.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    savedVals.saveMainGameValues();
}

@Override
protected void onStop() {
    super.onStop();
    savedVals.saveMainGameValues();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    savedVals.saveMainGameValues();
}

Я должен получить последний найденныйзначения или, по крайней мере, значения по умолчанию, но вместо этого приложение вылетает и получает следующую ошибку для обратного вызова в onStart или onResume:

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.andygix.a40love.SavedValues.getMainGameValues()' on a null object reference
    at com.andygix.a40love.MainGame.onResume(MainGame.java:379)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1364)
    at android.app.Activity.performResume(Activity.java:7490)

1 Ответ

0 голосов
/ 14 февраля 2019

У вас SavedValues класс, имеющий логическую ошибку.

Когда ваш класс будет инициализирован, будет вызван конструктор и mainGame получит какое-то значение, но до того, как вы создадите mPref переменную, поэтому она не имеет значения. Вы должныинициализируйте mPref в конструкторе.

Здесь я обновил класс .. Попробуйте заменить и проверить.

class SavedValues {

    private static final String keyP1fName = String.valueOf(R.string.player_1_name_key);
    private static final String keyP1Game = String.valueOf(R.string.player_1_game_key);
    private static final String keyP2fName = String.valueOf(R.string.player_2_sname_key);

    private MainGame mainGame;


    /**************************** THIS PART I CHANGED *******************/


    private SharedPreferences mPrefs;

    SavedValues(MainGame mainGame) {
        this.mainGame = mainGame;
        mPref = mainGame.getPreferences(Context.MODE_PRIVATE);
    }

    /**********************************************/

    //private SharedPreferences mPrefs = mainGame.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);

    //SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    void saveMainGameValues() {
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putString(keyP1fName, mainGame.fullNameP1.getText().toString());
        editor.putString(keyP1Game, mainGame.gameScoreP1.getText().toString());

        editor.putString(keyP2fName, mainGame.fullNameP2.getText().toString());
        editor.putString(keyP2Game, maingGame.gameScoreP2.getText().toString());
        editor.apply();
    }

    void getMainGameValues() {
        mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
        if (mPrefs.contains(keyP1fName)) {
            mainGame.fullNameP1.setText(mPrefs.getString(keyP1fName, "Player 1"));
            mainGame.gameScoreP1.setText(mPrefs.getString(keyP1Game, "0"));

            mainGame.fullNameP2.setText(mPrefs.getString(keyP2fName, "Player 2"));
            mainGame.gameScoreP2.setText(mPrefs.getString(keyP2Game, "0"));
        }}
}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...