android旋转屏幕导致文本颜色更改为默认值

时间:2018-06-03 16:32:34

标签: java android configuration

在我的Android应用程序中,我正在创建一个tic tac toe游戏,我在下面有这个代码,如果它的玩家一动,那么将他们的选择设置为具有特定颜色的 X ,否则它必须是播放器2,所以将文本设置为 O ,以便选择不同的颜色。

@Override
public void onClick(View v) {
    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

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

    ...

}

我遇到了一个问题,这是关于我何时旋转屏幕。当我旋转屏幕时,X和O的文本都变为android studio提供的默认文本颜色。我想保留这些文字的颜色,但我不知道该怎么做?我确保没有全局文本颜色集。

以下是处理方向更改的代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("playerOneMove", playerOneMove);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    playerOneMove = savedInstanceState.getBoolean("playerOneMove");
}

1 个答案:

答案 0 :(得分:2)

您需要保存tic tac toe board的每个盒子的颜色,并在布局配置更改(即设备旋转)上再次保留它们。

您可以考虑查看answer here以获取有关问题的详细说明。您可以在此处检查developer documentation以处理配置更改。

关键的想法是将布局状态保存在配置发生变化的变量中,并在onCreateonCreateView函数中相应地更新它们Activity和{{1} } 分别。但是,在您的情况下,您需要存储大量数据,并且在每次配置更改时,您需要再次还原它们,这不是一种有效的方法。我建议您寻找其他可用选项,这些选项可以在布局的方向或配置更改后继续使用。

我强烈建议在您的情况下实现ViewModel,它可以在应用程序配置更改后继续存在并以最有效的方式处理整个UI表示。我们的想法是将您的UI元素与Fragment绑定,然后每次都从ViewModel保留UI元素。它可以保留在准确状态,直到ViewModelActivity完成。

在您的情况下,我想提供一个如何准备Fragment的示例。让我们考虑您的ViewModelViewModel,它会保存您的主板的布局项目。

GameModel

现在,从您的public class GameModel extends ViewModel { public final LiveData<Game> gameLiveData = new LiveData<>(); public GameModel() { // trigger game load. } void doAction() { // depending on the action, do necessary business logic calls and update the gameLiveData. } } public class Game { public static final int CROSS = 1; public static final int ZERO = 0; public int pos1 = -1; // Default values are -1, when the position is yet to be played public int pos2 = -1; public int pos3 = -1; public int pos4 = -1; public int pos5 = -1; public int pos6 = -1; public int pos7 = -1; public int pos8 = -1; public int pos9 = -1; } ,您需要向Activity类添加一个观察者,以相应地更新UI。

GameModel

希望有所帮助!