代码之家  ›  专栏  ›  技术社区  ›  MysticSticker

如何在savedPreferences中保存按钮[]文本

  •  0
  • MysticSticker  · 技术社区  · 1 年前

    我有 Button[] buttons = new Button[9]; 稍后在活动中,按钮将设置为X或O。我需要保存给定按钮的文本是X还是O。当单击按钮时,该按钮将更改其文本。由于文本不是预先确定的或editText,我不知道如何保存它,以便在需要销毁活动以旋转屏幕时可以恢复它。使用循环保存所有9个按钮的文本会是一件事吗?

    @Override
        public void onClick(View v) {
            if (!((Button)v).getText().toString().equals("")) {
                return;
            }
    
            String buttonID = v.getResources().getResourceEntryName(v.getId());
            int gameStatePointer = Integer.parseInt(buttonID.substring(buttonID.length()-1));
    
            if (activePlayer) {
                ((Button)v).setText("X");
                ((Button)v).setTextColor(Color.parseColor("#ff4a4a"));
                gameState[gameStatePointer] = 0;
                gameStatus.setText("O's Turn");
            }
            else {
                ((Button)v).setText("O");
                ((Button)v).setTextColor(Color.parseColor("#70FFEA"));
                gameState[gameStatePointer] = 1;
                gameStatus.setText("X's Turn");
            }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Gabe Sechan    1 年前

    保存所有按钮文本的循环可以工作。但实际上,你的问题是,这不是一个构建数据的好方法。你不应该把你的状态存储在你的视图中。你应该有一个名为board的变量,用来保存游戏中每个方块的状态,并用它来设置你的视图。然后你只需要保存旋转时的板变量。

    通常,视图层不应该存储数据。它应该设置为显示存储在其他地方的数据。

        2
  •  0
  •   heX    1 年前

    您需要将视图的状态保存在已保存的声明捆绑包中,以便在屏幕旋转后恢复视图。

    首先,您需要用某种简单的结构来表示按钮的状态。一个快速的解决方案就是创建一个逗号分隔的列表,其中的值表示从0到8的按钮状态(9个可能的按钮)。例如: "O,X,O,-,-,O,X,X,-"

    之后,您需要将按钮状态保存在:

    @Override
    protected void onSaveInstanceState(@NonNull final Bundle outState) {
        super.onSaveInstanceState(outState);
        final String screenState = // ... loop to generate screen state
        outState.putString("some_key", screenState);
    }
    

    onCreate() 如果捆绑包中存在该值,则需要恢复屏幕:

    @Override
    public void onCreate(@Nullable final Bundle savedInstanceBundle) {
        if (bundle != null) {
            final String state = bundle.getString("some_key");
            if (state != null) {
                // ... restore state
            }
        }
    }
    

    注意:我同意前面的答案,屏幕状态不应该以这种方式存储在视图中,但我只是想提供一个简单的答案,而不涉及应用程序架构的复杂性。