【问题标题】:savedInstanceState changes colors based on previous user actionssavedInstanceState 根据之前的用户操作更改颜色
【发布时间】:2018-06-04 17:29:25
【问题描述】:

我有三个按钮,第一个被选中的按钮被标记为 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);


    }

【问题讨论】:

    标签: java android android-button onsaveinstancestate


    【解决方案1】:

    您看到的行为是正常的,因为您保存了一个 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? 
                     }
                }
            }
        } 
    

    如果您有更多按钮,将按钮状态分组并保存在列表中而不是单个按钮状态可能更有意义。

    【讨论】:

    • 感谢您的回答,但存在 lsight 问题。 btnState.put... 有问题,它与 .put 相关。它指出它无法解析字符串和字符序列之间的方法
    • 您是传奇先生。非常感谢:)
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多