Как использовать `onSaveInstanceState`? - PullRequest
0 голосов
/ 13 февраля 2020

Чего я хочу добиться?

  • Я хочу сохранить значения x, y и score, поэтому, когда пользователь поворачивает экран, значения извлекаются и не регенерируется.

Что у меня есть?

  1. Вероятно, правильный onSaveInstanceState код, который не работает, вероятно, из-за какого-то @Override конфликта с ним

Что мне нужно?

  • Исправление, которое поможет мне сохранить значения переменных

Код

MainActivity. java (без onSaveInstanceState)

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private EditText textBox;
    private int z;
    public int score = 0;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
        textBox = findViewById(R.id.editText);
        textBox.requestFocus();
        setActual();
    }

    private void setActual() {
        Random random = new Random();
        int x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
        int y = random.nextInt(10) + 1;
        z = x * y;
        String hintStr = x + " × " + y;
        ((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
    }


            public void onCheck(View view) {

        int answer = Integer.parseInt(textBox.getText().toString());
        String res = "Incorrect";
        if (answer == z) {
            res = "Correct";
            score++;
            Log.d("TAG", "Correct."); // right answer
            textBox.setText("");
            setActual(); // let's regenerate values
        } else if (score == 0) {
            Log.d("TAG", "Incorrect."); // wrong answer
            textBox.setText("");
            setActual();
            ((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
        } else {
            Log.d("TAG", "Incorrect."); // wrong answer
            textBox.setText("");
            score--;
            setActual();
        }
        ((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
        ((TextView) findViewById(R.id.result_text_view)).setText(res);
    }

}

MainActivity. java (с onSaveInstanceState)

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private EditText textBox;
    private int z;
    public int score = 0;
    private int x;
    private int y;

    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putInt("x", x);
        savedInstanceState.putInt("y", y);
        savedInstanceState.putInt("score", score);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textBox = findViewById(R.id.editText);
        textBox.requestFocus();
        setActual();
        if (savedInstanceState != null) {
            x = savedInstanceState.getInt("x");
            y = savedInstanceState.getInt("y");
            score = savedInstanceState.getInt("score");
        }
    }

    private void setActual() {
        Random random = new Random();
        x = random.nextInt(10) + 1; //you get a random number between 0 and 9 then add 1 to get 1 - 10, no need to use array..
        y = random.nextInt(10) + 1;
        z = x * y;
        String hintStr = x + " × " + y;
        ((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
    }


            public void onCheck(View view) {

        int answer = Integer.parseInt(textBox.getText().toString());
        String res = "Incorrect";
        if (answer == z) {
            res = "Correct";
            score++;
            Log.d("TAG", "Correct."); // right answer
            textBox.setText("");
            setActual(); // let's regenerate values
        } else if (score == 0) {
            Log.d("TAG", "Incorrect."); // wrong answer
            textBox.setText("");
            setActual();
            ((TextView) findViewById(R.id.scoreText)).setText(R.string.nullScore);
        } else {
            Log.d("TAG", "Incorrect."); // wrong answer
            textBox.setText("");
            score--;
            setActual();
        }
        ((TextView) findViewById(R.id.scoreText)).setText("Score:" + ' ' + score);
        ((TextView) findViewById(R.id.result_text_view)).setText(res);
    }

}

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вам следует подумать о вызове super.onSaveInstanceState ()

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    // save your state
    super.onSaveInstanceState(outState);
}

Кроме того, чтобы избежать воссоздания активности при каждом повороте экрана, вы можете самостоятельно обрабатывать изменение конфигурации, добавив это в объявление Activity в манифесте приложения. :

android:configChanges="keyboardHidden|orientation|screenSize"

И переопределение:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

Это может сэкономить время для пользователя, если ваше приложение не нуждается в воссоздании после изменения ориентации или изменения размера экрана ...

0 голосов
/ 13 февраля 2020

Вы уверены, что значения не получены? Я считаю, что проблема здесь в том, что вы всегда вызываете setActual () в onCreate (), который генерирует значения x и y и присваивает значение z сгенерированным x и y (даже когда saveInstanceState! = Null)

лучший способ

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textBox = findViewById(R.id.editText);
    textBox.requestFocus();

    if (savedInstanceState != null) {
        x = savedInstanceState.getInt("x");
        y = savedInstanceState.getInt("y");
        score = savedInstanceState.getInt("score");
        z = x * y;
        String hintStr = x + " × " + y;
        ((TextView) findViewById(R.id.hintTextView)).setText(hintStr);
    } else { setActual(); }
}

Вы также должны вызвать super.onSaveInstanceState (saveInstanceState), например,

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putInt("x", x);
    savedInstanceState.putInt("y", y);
    savedInstanceState.putInt("score", score);
}
...