【问题标题】:android rotating screen causes text colour to change to defaultandroid旋转屏幕导致文本颜色更改为默认值
【发布时间】:2018-11-13 01:55:20
【问题描述】:

在我创建井字游戏的 android 应用程序中,我有以下代码玩家 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");
}

【问题讨论】:

  • 尝试使用颜色资源中的颜色。使用 xml 颜色文件,然后使用 ((Button) v).setTextColor(R.color.your_color) 设置颜色
  • @SystemGlitch 我已经按照你说的设置了颜色,但问题仍然存在

标签: java android configuration


【解决方案1】:

您需要保存井字游戏每个方框的颜色,并在布局配置更改(即设备旋转)时再次保留它们。

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

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

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

就您而言,我想提供一个示例,说明如何准备ViewModel。让我们考虑您的ViewModelGameModel,它保存了您的电路板的布局项目。

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,您需要向您的GameModel 类添加一个观察者以相应地更新用户界面。

public class UserActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.game_activity_layout);
         final GameModel viewModel = ViewModelProviders.of(this).get(GameModel.class);
         viewModel.gameLiveData.observer(this, new Observer() {
            @Override
             public void onChanged(@Nullable Game gameData) {
                 // update ui.
             }
         });
         findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                  // Pass parameters in doAction function to set the items in the Game class and update the ui accordingly inside the onChanged function.
                  viewModel.doAction(); 
             }
         });
     }
}

希望对您有所帮助!

【讨论】:

  • 很酷,我将保留它以供我构建的下一个应用程序使用。至于保持颜色的快速修复,我需要在代码中添加什么?感谢您的回答
  • 有没有一种方法可以调用我的按钮来放置我的保存实例和恢复实例?
  • 正如我的回答中提到的,您可以查看link here,了解您将如何保存数据以及实例状态。希望有帮助!
  • 我应该说的是如何调用已保存实例中的按钮,这就是我正在努力的部分。我想存储我的 onsaveinstance 和 onrestore 中已经选择的 x 和 o 但不知道如何调用它?
  • Cool Reaz,我会这样做的,非常感谢你:)
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多