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

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

布局截图

布局截图,需在下方圆形区域显示重试按钮/TextView


实现步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:10:13