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

Android游戏中TextView无法实时更新玩家金额问题求助

解决TextView无法实时更新玩家金额的问题

你的问题核心有三点:一是仅在Activity启动时刷新了一次金额,收支操作后未触发UI更新;二是金额格式化的条件顺序错误,导致百万级金额无法被正确转换;三是每次刷新都重复创建数据库实例,造成不必要的资源消耗。

具体修复步骤

1. 修正金额格式化逻辑

原判断顺序先检查>=100000,再检查>=1000000,会导致所有>=100000的金额(包括百万级)都被前一个条件拦截,永远走不到百万分支。需改为从大到小判断金额区间。

2. 收支操作后主动触发UI刷新

在完成收支的数据库操作后,直接调用updateGame()方法,即可实时刷新TextView显示。

3. 优化数据库实例创建

不要每次刷新都新建DataBase对象,在Activity启动时初始化一次即可,减少资源消耗。


修正后的完整代码片段

成员变量与onCreate部分

private SubsamplingScaleImageView imageView;
private CustomButton up, down, menu, employ, sales, social, schedule, chart, states, mail;
private TextView comMon, comName;
private DataBase db; // 全局数据库实例

Handler handler = new Handler(Looper.getMainLooper());

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_screen);
    
    // 先绑定控件,避免空指针
    comName = findViewById(R.id.companyname);
    comMon = findViewById(R.id.money);
    
    db = new DataBase(GameScreen.this); // 仅初始化一次
    officeRender();
    updateGame(); // 启动时加载初始数据
    butThread thread = new butThread();
    new Thread(thread).start();
}

修正后的updateGame方法

public void updateGame() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            Account acc = db.getAcc();
            comName.setText(acc.getName() + " Ent.");
            
            long money = acc.getMoney();
            String monText;
            
            // 从大到小判断金额区间,确保大金额能被正确匹配
            if (money >= 1000000) {
                // 格式化百万级金额,比如1234567显示为1.2m
                monText = String.format("%.1fm", money / 1000000.0);
            } else if (money >= 100000) {
                // 格式化十万级金额,比如123456显示为123.5k
                monText = String.format("%.1fk", money / 1000.0);
            } else {
                monText = String.valueOf(money);
            }
            
            comMon.setText(monText);
        }
    });
}

收支操作时调用刷新(示例)

比如点击雇佣按钮扣钱后,立刻触发UI更新:

employ.setOnClickListener(v -> {
    // 执行扣钱逻辑,更新数据库
    Account currentAcc = db.getAcc();
    db.updateMoney(currentAcc.getMoney() - 50000);
    // 触发UI刷新
    updateGame();
});

进阶方案:用LiveData自动响应数据变化

如果你的数据库使用Room,推荐用LiveData包装Account数据,这样数据变化时UI会自动刷新,无需手动调用updateGame():

  1. 在DataBase类中修改查询方法:
// Room数据库示例
@Query("SELECT * FROM account LIMIT 1")
LiveData<Account> getAccLive();
  1. 在Activity的onCreate中观察数据:
db.getAccLive().observe(this, acc -> {
    comName.setText(acc.getName() + " Ent.");
    
    long money = acc.getMoney();
    String monText;
    if (money >= 1000000) {
        monText = String.format("%.1fm", money / 1000000.0);
    } else if (money >= 100000) {
        monText = String.format("%.1fk", money / 1000.0);
    } else {
        monText = String.valueOf(money);
    }
    comMon.setText(monText);
});

这样只要数据库中的金额变化,TextView会自动更新,完全无需手动触发刷新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:40:34