saveInstanceState меняет цвета на основе предыдущих действий пользователя - PullRequest
0 голосов
/ 04 июня 2018

У меня есть три кнопки, и любая из выбранных кнопок первая помечена знаком X, а вторая выбранная кнопка будет помечена буквой O, а последняя кнопка снова помечена как X.

Если помечена буква Xзатем его цвет белый, если это O, то он помечен серым.

Теперь я хочу использовать сохраненный экземпляр, чтобы при повороте телефона цвета оставались такими же, как были.На самом деле происходит то, что если я поверну телефон, то какой последний выбор был сделан, весь текст вернется к этому цвету.

Так что, если я нажму на X и O и поверну телефон, и X, иO будет отображаться серым цветом, который соответствует цветам O.

Если я затем выберу последний X и поверну телефон, все буквы будут отмечены белым цветом, который соответствует цвету X.

Я не уверен, вызывает ли это заданный цвет, или он помнит, кто его двигал ранее, и устанавливает цвет в соответствии с этим, мой вопрос: как решить, чтобы все буквы сохранили свой цвет при вращении?

private boolean playerOneMove = true;

private Button[][] buttons = new Button[1][3];

private static final String TEXT_COLOR = "textColor";
    private String textColor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main_player2);

        btnObj1 = findViewById(R.id.button_00);
        btnObj2 = findViewById(R.id.button_01);
        btnObj3 = findViewById(R.id.button_02);

if (savedInstanceState != null) {
           textColor = savedInstanceState.getString(TEXT_COLOR);

            if(btnObj1 != null) {
                btnObj1.setTextColor(Color.parseColor(textColor));
            }
            if (btnObj2 != null) {
                btnObj2.setTextColor(Color.parseColor(textColor));
            }
            if (btnObj3 != null) {
                btnObj3.setTextColor(Color.parseColor(textColor));
            }

        for (int i = 0; i < 1; i++) {
            for (int j = 0; j < 3; j++) {
                String buttonID = "button_" + i + j;
                int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
                buttons[i][j] = findViewById(resID);
                buttons[i][j].setOnClickListener(this);
            }
        }
}

@Override
    public void onClick(View v) {

        if (!((Button) v).getText().toString().equals("")) {
            return;
        }

        if (playerOneMove) {
            ((Button) v).setText("X");
            textColor = "#e8e5e5";
            ((Button) v).setTextColor(Color.parseColor(textColor));
        } else {
            ((Button) v).setText("O");
            textColor = "#737374";
            ((Button) v).setTextColor(Color.parseColor(textColor));
        }
}

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putBoolean("playerOneMove", playerOneMove);
        outState.putString(TEXT_COLOR, textColor);

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) { ;
        super.onRestoreInstanceState(savedInstanceState);


        playerOneMove = savedInstanceState.getBoolean("playerOneMove");
        textColor = savedInstanceState.getString(TEXT_COLOR);


    }

1 Ответ

0 голосов
/ 04 июня 2018

Поведение, которое вы видите, является нормальным, потому что вы сохраняете один textColor, который всегда будет тем, который был последний раз установлен пользователем.Вместо этого вы можете просто перебрать массив кнопок и сохранить цвет текста каждой кнопки:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    for (int i = 0; i < 1; i++) {
        for (int j = 0; j < 3; j++) {
            String buttonID = "button_" + i + j;  
            Button btn = buttons[i][j];                
            outState.putCharSequence(buttonID, btn.getText());
        }
    }
}

Затем в onCreate () (удалить метод onRestoreInstanceState ()) восстановить состояние кнопки:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_player2);
    int playerX = Color.parseColor("#e8e5e5");
    int playerO = Color.parseColor("#737374");
    for (int i = 0; i < 1; i++) {
        for (int j = 0; j < 3; j++) {
            String buttonID = "button_" + i + j;
            int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i][j] = findViewById(resID);
            buttons[i][j].setOnClickListener(this);
            if (savedInstanceState != null) {
                 String btnState = savedInstanceState.getCharSequence(buttonID);
                 if (btnState.equals("X")) {
                     // this is player X
                     buttons[i][j].setTextColor(playerX);
                 } else if (btnState.equals("O")) {
                     // this is player O
                     buttons[i][j].setTextColor(playerO);
                 } else {
                     // unclicked btn, do you have another color? 
                 }
            }
        }
    } 

Если у вас больше кнопок, возможно, имеет смысл сгруппировать состояния кнопок в списке и сохранить их вместо отдельных состояний кнопок.

...