使用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
相关产品推荐
相关产品推荐

