You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用onActivityResult实现四人游戏分数加减功能遇阻求助

解决四人计分APP的分数加减与数据传递问题

嘿,我来帮你捋捋这个问题哈!你的需求完全是可以实现的,只是当前的代码逻辑有几个关键问题,咱们一步步来修正:

先说说当前代码的核心问题

  • 冗余的子Activity: 你给每个玩家的加减都创建了单独的Activity,这不仅重复代码,还会导致维护困难——其实只需要一个通用的子Activity来处理所有玩家的分数输入,通过参数区分操作类型和玩家即可。
  • 分数计算逻辑错误: 在onActivityResult里,你尝试拿message5这个额外数据,但你的减号子Activity并没有传递这个值;而且你没有维护每个玩家的当前分数,直接用输入值替换或做无意义的减法,自然没法实现累加/扣除的效果。
  • 请求码与数据传递不匹配: 玩家1的减号按钮用了请求码1,但加号按钮也是请求码1,这会导致主Activity无法区分是加还是减操作。

修正方案与代码示例

第一步:简化为一个通用的分数输入子Activity

创建一个ScoreInputActivity,用来处理所有玩家的加减分数输入,通过Intent接收玩家ID和操作类型:

public class ScoreInputActivity extends AppCompatActivity {
    private EditText mEditText;
    private ImageButton mBackSpace;
    private int mPlayerId;
    private boolean isAddOperation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_score_input);
        
        // 接收主Activity传递的参数
        mPlayerId = getIntent().getIntExtra("PLAYER_ID", 1);
        isAddOperation = getIntent().getBooleanExtra("IS_ADD", true);
        
        // 设置标题区分加减
        setTitle(isAddOperation ? "ADD POINTS FOR PLAYER " + mPlayerId : "MINUS POINTS FOR PLAYER " + mPlayerId);

        mEditText = findViewById(R.id.editTxtActivity);
        mBackSpace = findViewById(R.id.backSpaceButton);
        
        // 退格按钮逻辑
        mBackSpace.setOnClickListener(v -> {
            String str = mEditText.getText().toString();
            if (str.length() > 0) {
                str = str.substring(0, str.length() - 1);
                mEditText.setText(str);
            }
        });
    }

    @Override
    public void onBackPressed() {
        Intent resultIntent = new Intent();
        // 返回玩家ID、操作类型、输入的分数
        resultIntent.putExtra("PLAYER_ID", mPlayerId);
        resultIntent.putExtra("IS_ADD", isAddOperation);
        try {
            int score = Integer.parseInt(mEditText.getText().toString().trim());
            resultIntent.putExtra("INPUT_SCORE", score);
            setResult(RESULT_OK, resultIntent);
            Toast.makeText(this, (isAddOperation ? "Added " : "Subtracted ") + score + " points", Toast.LENGTH_LONG).show();
        } catch (NumberFormatException e) {
            // 处理输入非数字的情况
            Toast.makeText(this, "Please enter a valid number", Toast.LENGTH_SHORT).show();
            return;
        }
        finish();
    }
}

第二步:修改主Activity的点击事件与初始化

首先在主Activity里维护每个玩家的当前分数变量,然后统一处理所有按钮的点击:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView mFirstScore, mSecondScore, mThirdScore, mFourthScore;
    // 维护每个玩家的当前分数
    private int[] playerScores = {0, 0, 0, 0}; // 对应玩家1-4

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 初始化TextView
        mFirstScore = findViewById(R.id.first_score);
        mSecondScore = findViewById(R.id.second_score);
        mThirdScore = findViewById(R.id.third_score);
        mFourthScore = findViewById(R.id.fourth_score);
        
        // 设置所有按钮的点击监听
        findViewById(R.id.buttPlusPlayer1).setOnClickListener(this);
        findViewById(R.id.buttPlusPlayer2).setOnClickListener(this);
        findViewById(R.id.buttPlusPlayer3).setOnClickListener(this);
        findViewById(R.id.buttPlusPlayer4).setOnClickListener(this);
        findViewById(R.id.buttMinusPlayer1).setOnClickListener(this);
        findViewById(R.id.buttMinusPlayer2).setOnClickListener(this);
        findViewById(R.id.buttMinusPlayer3).setOnClickListener(this);
        findViewById(R.id.buttMinusPlayer4).setOnClickListener(this);
        
        // 初始化显示分数
        updateScoreDisplays();
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, ScoreInputActivity.class);
        switch (v.getId()) {
            case R.id.buttPlusPlayer1:
                intent.putExtra("PLAYER_ID", 1);
                intent.putExtra("IS_ADD", true);
                startActivityForResult(intent, 100); // 用统一的请求码即可
                break;
            case R.id.buttPlusPlayer2:
                intent.putExtra("PLAYER_ID", 2);
                intent.putExtra("IS_ADD", true);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttPlusPlayer3:
                intent.putExtra("PLAYER_ID", 3);
                intent.putExtra("IS_ADD", true);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttPlusPlayer4:
                intent.putExtra("PLAYER_ID", 4);
                intent.putExtra("IS_ADD", true);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttMinusPlayer1:
                intent.putExtra("PLAYER_ID", 1);
                intent.putExtra("IS_ADD", false);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttMinusPlayer2:
                intent.putExtra("PLAYER_ID", 2);
                intent.putExtra("IS_ADD", false);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttMinusPlayer3:
                intent.putExtra("PLAYER_ID", 3);
                intent.putExtra("IS_ADD", false);
                startActivityForResult(intent, 100);
                break;
            case R.id.buttMinusPlayer4:
                intent.putExtra("PLAYER_ID", 4);
                intent.putExtra("IS_ADD", false);
                startActivityForResult(intent, 100);
                break;
        }
    }

    // 更新所有玩家的分数显示
    private void updateScoreDisplays() {
        mFirstScore.setText(String.valueOf(playerScores[0]));
        mSecondScore.setText(String.valueOf(playerScores[1]));
        mThirdScore.setText(String.valueOf(playerScores[2]));
        mFourthScore.setText(String.valueOf(playerScores[3]));
    }
}

第三步:修正onActivityResult逻辑,实现正确的分数加减

在主Activity里重写onActivityResult,根据返回的参数更新对应玩家的分数:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
        int playerId = data.getIntExtra("PLAYER_ID", 1);
        boolean isAdd = data.getBooleanExtra("IS_ADD", true);
        int inputScore = data.getIntExtra("INPUT_SCORE", 0);
        
        // 根据玩家ID和操作类型更新分数
        int index = playerId - 1; // 对应数组索引
        if (isAdd) {
            playerScores[index] += inputScore;
        } else {
            // 可以加个判断,防止分数变成负数,根据你的需求调整
            playerScores[index] = Math.max(0, playerScores[index] - inputScore);
        }
        
        // 更新显示
        updateScoreDisplays();
    }
}

额外建议

  • 可以给EditText设置输入类型为数字,避免用户输入非数字内容:在XML里给EditText加上android:inputType="number"。
  • 如果需要持久化分数(比如退出APP后保存),可以用SharedPreferences来存储playerScores数组。

内容的提问来源于stack exchange,提问作者Azkan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:44:51