首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >savedInstanceState根据之前的用户操作更改颜色

savedInstanceState根据之前的用户操作更改颜色
EN

Stack Overflow用户
提问于 2018-06-05 01:29:25
回答 1查看 54关注 0票数 0

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


    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 02:59:13

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50685842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档