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

2023-11-29

在我创建井字棋游戏的 Android 应用程序中,我在下面有这段代码,如果是玩家一步,则将其选择设置为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");
}

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

您可能会考虑调查在这里回答以获得您问题的详细解释。您可能会检查开发者文档这里也用于处理配置更改。

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

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

对于您的情况,我想提供一个示例,说明如何准备ViewModel。让我们考虑一下您的ViewModel is 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,你需要添加一个观察者到你的GameModel类来相应地更新 UI。

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(); 
             }
         });
     }
}

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何从 github 存储库安装打字稿定义

    如何为像 aurelia validatejs 这样的库安装 typescript defs 就像我所做的那样npm install aurelia validatejs save将其添加到package json and node mod
  • NHibernate - 映射字符串外键

    我继承的旧数据库包含以下表格 Teams TeamId INT PRIMARY KEY Name VARCHAR 30 Players PlayerId INT PRIMARY KEY Team VARCHAR 30 Players 表中的
  • 为什么我的代码在c++中无限循环。我的代码需要反复提示用户

    我的代码需要反复提示用户输入整数 当用户不再想继续输入数字时 输出用户输入的所有正数之和 然后输出用户输入的所有负数之和 这是我到目前为止所拥有的 include
  • 允许将 T* 与 char* 别名。反过来也允许吗?

    Note 该问题已被重命名并减少 以使其更加集中和可读 大多数评论都是指旧文本 根据标准 不同类型的对象不能共享相同的内存位置 所以这是不合法的 std array
  • nhibernate 查询所有实现接口的对象

    例如 如果您有一个 Apple IWhatever 和一个 Orange IWhatever 并且您想找到它们 因为它们都是 IWhatever 那么您需要在 NHibernate 中做什么 它是否完全依赖于 HQL 和条件查询 还是您还必
  • 修改查询字符串而不重新加载页面

    我正在创建一个照片库 并且希望能够在浏览照片时更改查询字符串和标题 我正在寻找的行为经常出现在连续 无限页面的某些实现中 当您向下滚动查询字符串时 会不断增加页码 http x com page 4 等等 理论上这应该很简单 但我想要一些在
  • 将图像字节数据流解码为 JPEG

    我正在努力成功地将 JPEG 图像从字节解码回 JPEG 我从 MJPG 字节流的编码帧开始 我想对其进行解码以便使用 OpenCV 进行操作 我是 Python numpy opencv 等方面的新手 我现在将帧 JPG 数据放在文本文件
  • Vanilla JS Div 碰撞检测

    我的以下实现可以在jsfiddle net 我有四个div 我的目标是使它们可以在页面上拖动 但不允许它们彼此重叠 每个都可以使用 mousemove 侦听器在页面上拖动 container addEventListener mousemo
  • 在哪里可以找到 PyQt5 方法签名?

    我想编写一个带有图形用户界面的小型应用程序 为此我安装了 PyQt5 在教程中 我发现 QMessageBox information 调用已完成 我想更改调用方式 而不是 QMessageBox information self Empt
  • IE 和 Webkit 移动设备中对最大图像像素大小是否有任意限制?

    最近的一个项目使用了非常像素大 5e3px2 但仍然是字节小 100kb GIF 的图像 IE8 和 iOS Safari 都拒绝渲染 两者似乎都知道图像大小 但只是不渲染它们 一个实用的解决方案是对图像进行切片 但是这些浏览器对最大图像像
  • 除了架构方面的考虑之外,为什么要在 Swift 中标记一些最终的东西呢?

    除了明显的原因 例如如果按照设计 我不希望某些方法 属性或任何内容在继承树中被覆盖 是否还有其他原因来标记事物final在斯威夫特 例如 是否有性能方面的考虑 我记得在某处读到过一些答案 其中提出了一些建议 来自 Apple 的 Swift
  • THREE.js - 广告牌顶点着色器

    我需要将 THREE Mesh 的实例定向为始终面向相机 我知道我可以只使用 THREE Mesh lookAt 方法 但我正在尝试更多地处理我的 GLSL 部分 并希望能够在顶点着色器中执行此操作 我已读完NeHe 的广告牌教程 这对我来
  • CSS 引用每个奇怪的嵌套子元素?

    我正在尝试制作一个评论系统 其中嵌套评论具有斑马背景颜色 蓝色背景回复白色背景回复蓝色背景 有没有办法引用这些嵌套的子项 而不是将它们称为 comment comment comment comment comment comment co
  • 使用 Bintray 在 jCenter 上发布 Android Studio 库时遇到问题

    我按照本教程在 Jcenter 上发布示例 Android Studio 库 http crushingcode co publish your android library via jcenter 看起来很清楚 我已通过此链接使用此库创
  • Databricks - 创建永久用户定义函数 (UDF)

    我能够创建一个 UDF 函数并使用 Spark UDF 方法注册到 Spark 但是 这仅限于每个会话 如何在Cluster启动时自动注册python UDF函数 这些功能应该可供所有用户使用 示例用例是将时间从 UTC 转换为本地时区 这
  • 字符串未被识别为有效的日期时间“格式 dd/MM/yyyy”

    我正在尝试将字符串格式化值转换为具有格式的日期类型dd MM yyyy this Text 22 11 2009 DateTime date DateTime Parse this Text 问题是什么 它有第二个覆盖 要求IFormatP
  • C 语言中的简单字符解释

    这是我的代码 include
  • 如何在 cytoscapejs 中操作后保存图形的整个状态

    我在 Angular 中使用 cytoscapejs 我希望用户在完成一些操作 例如平移 缩放 移动节点和边缘 后保存图形的状态 我尝试将整个对象保存在临时变量中 并尝试通过单击按钮使用保存的对象重新加载图形来渲染图形 const cy c
  • 从通话中转接 Twilio 呼叫

    我没有从 Twilio 文档中找到关于此问题的明确答案 我正在尝试构建一个电话系统 该系统可以在通话时且仅通过电话将对方置于保持状态 示例 有两名特工在现场与我一起工作 我通过手机 远离计算机 接到电话 发现另一位客服人员需要与我通话的人通
  • android旋转屏幕导致文本颜色更改为默认值

    在我创建井字棋游戏的 Android 应用程序中 我在下面有这段代码 如果是玩家一步 则将其选择设置为X具有特定的颜色 否则它必须是玩家 2 因此将文本设置为O供他们选择不同的颜色 Override public void onClick