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():
- 在DataBase类中修改查询方法:
// Room数据库示例 @Query("SELECT * FROM account LIMIT 1") LiveData<Account> getAccLive();
- 在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
相关产品推荐
相关产品推荐

