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

Android实现按钮每点击20次触发指定方法功能失效求助

问题排查

你代码里存在3处核心逻辑错误,导致计数永远无法达到20的触发阈值:

  • 你没有将自增后的点击次数回写到SharedPreferences中,每次点击都会重新读取初始默认值0,自增后仅在当前方法作用域内有效,下一次点击又会重置为0,永远无法累计到20
  • 你声明并初始化的是自定义文件名的SharedPreferences实例,但读取时用的是系统默认的getDefaultSharedPreferences,两者对应完全不同的存储文件,就算你提前存了值也读不到
  • 可选优化:你调用this.turnAround()时的this指向的是OnClickListener内部类实例,虽然当前逻辑不影响执行,但若后续要访问外部类方法建议显式指定上下文避免歧义

修正后的代码

修改onClick内的逻辑即可:

changeTextButton.setOnClickListener(new View.OnClickListener() {
    
    @Override
    public void onClick(View v){
        // 改用你自己初始化的自定义SharedPreferences实例读取
        long nb_shown_lobby = sharedpreferences.getLong("nShownLobby", 0); 
        ++nb_shown_lobby; 
        if ((nb_shown_lobby % 20) == 0) { 
            turnAround(); 
        }
        // 将自增后的计数回写到SharedPreferences持久化存储
        SharedPreferences.Editor editor = sharedpreferences.edit();
        editor.putLong("nShownLobby", nb_shown_lobby);
        editor.apply();

        // 原有逻辑保持不变
        int random = (int) (Math.random() * manyDifferentStrings.length);
        if (random == oldVaue) {
            random = (int) (Math.random() * manyDifferentStrings.length);
        }
        changingText.setText(manyDifferentStrings[random]);
        oldVaue = random;
        try {
            mySound.start();
        } catch (NullPointerException e) {
            mySound = MediaPlayer.create(MainActivity.this, R.raw.sound);
        }
    }

    private void turnAround() {
        //Do something here
        Log.i("Do Something ", "");
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:02