SharedPreferences для нескольких действий - PullRequest
0 голосов
/ 31 мая 2018

Во-первых, мне жаль, если это дубликат, я искал и не нашел ответа.

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

Он правильно оценивает вопросы, но не сохраняет результаты между вопросами.

Основная деятельность

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    SharedPreferences settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);

    SharedPreferences.Editor editor = settings.edit();
    editor.putInt("score", userPoints);
    editor.commit();


};

Q1 (эта логика одинакова для каждого вопроса. Она запускается нажатием кнопки)

private SharedPreferences settings;
private int userPoints;
private int points;
 public void submitAnswer (View view) {

    if (correctAnswer.isChecked()) {
        userPoints = userPoints + 1;
    } else {
        userPoints = userPoints;
    }

    settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
    points = settings.getInt("score", userPoints);

    Toast.makeText(this, "Answer saved", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(Q1.this, MainActivity.class);
    startActivity(intent);
}

Я очень новичок в этом, и я знаю, что что-то упустил, я просто не могу понять, что это такое.Любая помощь очень ценится.

*** РЕДАКТИРОВАТЬ ****

Это кнопка для вызова счета, и она все еще считает только 1 из 6 баллов.

private int userPoints;
TextView pointsAwarded;
ImageButton home;
Button check;
int points;
SharedPreferences settings;    

check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
                points = settings.getInt("score", userPoints);

                pointsAwarded.setText(String.valueOf(points));
            }
        });

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

На самом деле в коде есть несколько ошибок.Во-первых, вместо этого вы сохраняете score в MainActivity или читаете его.И вместо этого вы читаете score в submitAnswer или редактируете его.

Я обычно пессимистичен при работе с SharedPreferences, поэтому я проверяю, установлен ли ключ с contains().

private int points;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SharedPreferences settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
    if(settings.contains("score"){
        points = settings.getInt("score", userPoints);
    }
    else{
        Log.e(TAG, "No score yet!");

        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("score", 0);
        editor.commit();
    }
}

Теперь в вопросе Упражнение вы можете прочитать текущие точки из SharedPreferences, обновить значение и сохранить обратно до SharedPreferences.

public void submitAnswer (View view) {
    if (correctAnswer.isChecked()) {
        SharedPreferences settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
        if(settings.contains("score"){
            int points = settings.getInt("score", 0);
            points++;

            SharedPreferences.Editor editor = settings.edit();
            editor.putInt("score", points);
            editor.commit();
            Toast.makeText(this, "Answer saved : points = " + points, Toast.LENGTH_SHORT).show();
        }
        else{
            Log.e(TAG, "No score yet!");
        }
    } 
    else{
            Toast.makeText(this, "Wrong Answer", Toast.LENGTH_SHORT).show();
    }

    // There is no need to start the MainActivity through a new Intent just call finish();
    finish();
    //... and you return to the Activity that is at the top of the stack.

    //Intent intent = new Intent(Q1.this, MainActivity.class);
    //startActivity(intent);
}
0 голосов
/ 31 мая 2018

Вы должны добавить текущие пользовательские баллы в сохраненные баллы, а затем сохранить их после добавления:

private SharedPreferences settings;
private int userPoints;
private int points;
public void submitAnswer (View view) {

if (correctAnswer.isChecked()) {
    userPoints = userPoints + 1;
} else {
    userPoints = userPoints;
}

settings = getSharedPreferences("userScore", Context.MODE_PRIVATE);
points = settings.getInt("score", userPoints);

userPoints = userPoints + points ; // addition of current userpoints with saved points 

  // Now save this points 
  SharedPreferences.Editor editor = settings.edit();
  editor.putInt("score", userPoints );
  editor.commit();

Toast.makeText(this, "Answer saved", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Q1.this, MainActivity.class);
startActivity(intent);
}
0 голосов
/ 31 мая 2018

`` `

if (correctAnswer.isChecked()) {
userPoints = userPoints + 1;}  

` `` после этого вы должны сохранить userPoints.может быть, вы забыли.

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