Android开发:点击6个按钮后显示重试控件并重置状态的疑问
Android随机数生成应用功能补全方案
需求说明
我正在开发一款Android随机数生成应用,已通过switch case实现6个按钮生成随机数的功能,现在需要完成两项逻辑:
- 用户点击完所有6个按钮后,在截图下方的圆形区域显示重试按钮或TextView
- 用户点击重试按钮后,应用回到初始状态
当前实现代码
@Override public void onClick(View v) { switch (v.getId()) { case R.id.img_1: f2413X = false; Random random = new Random(); int val = random.nextInt(100); // save random number in an integer variable textView3.setText(Integer.toString(val)); //convert to String and set it as text inside the textview box1.setVisibility(View.INVISIBLE); linearLayout1.setVisibility(View.VISIBLE); final Handler handler = new Handler(Looper.getMainLooper()); handler.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; case R.id.img_2: f2414Y = false; Random random2 = new Random(); int val2 = random2.nextInt(100); // save random number in an integer variable textView4.setText(Integer.toString(val2)); //convert to String and set it as text inside the textview box2.setVisibility(View.INVISIBLE); linearLayout2.setVisibility(View.VISIBLE); final Handler handler2 = new Handler(Looper.getMainLooper()); handler2.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val2 + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val2)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; case R.id.img_3: f2415Z = false; Random random3 = new Random(); int val3 = random3.nextInt(100); // save random number in an integer variable textView5.setText(Integer.toString(val3)); //convert to String and set it as text inside the textview box3.setVisibility(View.INVISIBLE); linearLayout3.setVisibility(View.VISIBLE); final Handler handler3 = new Handler(Looper.getMainLooper()); handler3.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val3 + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val3)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; case R.id.img_4: f2416a0 = false; Random random4 = new Random(); int val4 = random4.nextInt(100); // save random number in an integer variable textView7.setText(Integer.toString(val4)); //convert to String and set it as text inside the textview box4.setVisibility(View.INVISIBLE); linearLayout4.setVisibility(View.VISIBLE); final Handler handler4 = new Handler(Looper.getMainLooper()); handler4.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val4 + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val4)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; case R.id.img_5: f2417b0 = false; Random random5 = new Random(); int val5 = random5.nextInt(100); // save random number in an integer variable textView8.setText(Integer.toString(val5)); //convert to String and set it as text inside the textview box5.setVisibility(View.INVISIBLE); linearLayout5.setVisibility(View.VISIBLE); final Handler handler5 = new Handler(Looper.getMainLooper()); handler5.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val5 + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val5)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; case R.id.img_6: f2418c0 = false; GameScreen gameScreen2 = GameScreen.this; GameScreen.coinCollected(gameScreen2, gameScreen2.f2410U); Random random6 = new Random(); int val6 = random6.nextInt(100); // save random number in an integer variable textView9.setText(Integer.toString(val6)); //convert to String and set it as text inside the textview box6.setVisibility(View.INVISIBLE); linearLayout6.setVisibility(View.VISIBLE); final Handler handler6 = new Handler(Looper.getMainLooper()); handler6.postDelayed(new Runnable() { @Override public void run() { builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val6 + " coins") .setCancelable(false) .setPositiveButton("COLLECT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { int coins = Integer.parseInt(String.valueOf(Integer.parseInt(Integer.toString(val6)))); prefs.setCoins(coins); displayCoins(); } }); builder.show(); } }, 200); break; default: break; } }
布局截图

实现步骤
1. 添加重试按钮到布局
在布局文件的圆形区域容器内添加重试按钮,初始设置为隐藏:
<Button android:id="@+id/retry_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重试" android:visibility="gone" android:layout_centerInParent="true"/>
(根据你的布局结构调整位置属性,确保按钮位于圆形区域内)
2. 检测所有按钮是否点击完成
添加一个方法用来检查所有按钮是否都被点击:
private void checkAllButtonsClicked() { // 判断所有标记变量是否都为false(表示已点击) if (!f2413X && !f2414Y && !f2415Z && !f2416a0 && !f2417b0 && !f2418c0) { // 显示重试按钮 findViewById(R.id.retry_btn).setVisibility(View.VISIBLE); } }
在每个按钮case的break;之前调用这个方法,比如在case R.id.img_1中:
// ...原有代码 handler.postDelayed(...); checkAllButtonsClicked(); // 添加这行 break;
其余5个按钮的case同理添加。
3. 实现重试按钮的重置逻辑
在onClick的switch中添加重试按钮的case处理:
case R.id.retry_btn: // 重置所有按钮状态标记为true(初始可点击状态) f2413X = true; f2414Y = true; f2415Z = true; f2416a0 = true; f2417b0 = true; f2418c0 = true; // 恢复所有按钮显示,隐藏结果布局 box1.setVisibility(View.VISIBLE); linearLayout1.setVisibility(View.INVISIBLE); box2.setVisibility(View.VISIBLE); linearLayout2.setVisibility(View.INVISIBLE); box3.setVisibility(View.VISIBLE); linearLayout3.setVisibility(View.INVISIBLE); box4.setVisibility(View.VISIBLE); linearLayout4.setVisibility(View.INVISIBLE); box5.setVisibility(View.VISIBLE); linearLayout5.setVisibility(View.INVISIBLE); box6.setVisibility(View.VISIBLE); linearLayout6.setVisibility(View.INVISIBLE); // 隐藏重试按钮 findViewById(R.id.retry_btn).setVisibility(View.GONE); // 清空所有随机数显示文本(可选,根据需求调整) textView3.setText(""); textView4.setText(""); textView5.setText(""); textView7.setText(""); textView8.setText(""); textView9.setText(""); break;
同时在onCreate方法中给重试按钮设置点击监听:
findViewById(R.id.retry_btn).setOnClickListener(this);
4. (可选)优化代码冗余
当前代码中每个按钮的逻辑高度重复,可以将随机数生成、弹窗逻辑抽成公共方法,减少代码量,比如:
private void handleButtonClick(View button, TextView resultTv, View box, View resultLayout, boolean[] flag) { flag[0] = false; Random random = new Random(); int val = random.nextInt(100); resultTv.setText(Integer.toString(val)); box.setVisibility(View.INVISIBLE); resultLayout.setVisibility(View.VISIBLE); new Handler(Looper.getMainLooper()).postDelayed(() -> { AlertDialog.Builder builder = new AlertDialog.Builder(GameScreen.this); builder.setTitle("Congratulations") .setMessage("You won " + val + " coins") .setCancelable(false) .setPositiveButton("COLLECT", (dialog, which) -> { int coins = Integer.parseInt(String.valueOf(val)); prefs.setCoins(coins); displayCoins(); }); builder.show(); }, 200); checkAllButtonsClicked(); }
这样每个case可以简化为:
case R.id.img_1: handleButtonClick(v, textView3, box1, linearLayout1, new boolean[]{f2413X}); break;
(注意需要将原有布尔变量改为数组,因为Java值传递特性)
内容的提问来源于stack exchange,提问作者Sufyan Hashmi
相关产品推荐
相关产品推荐

