如何在点击增量按钮时实现TextView数值的乘法计算?
解决Firebase项目中增量按钮的数值乘法计算问题
我看了你的代码和需求,目前的实现有几个关键问题需要调整,才能完美实现你想要的订单数递增+总价按初始单价计算的功能,下面给你详细的解决方案:
现有代码的核心问题
- 初始订单数不符合需求:你把
count初始设为0,第一次点击+按钮才变成1,但需求是订单数从1开始递增,初始状态就该显示1。 - 价格类型处理错误:你用
Integer.parseInt(price)解析价格,但初始价格是1.00这类小数,会直接抛出NumberFormatException异常。 - 初始单价被覆盖:每次点击+按钮时,你把计算后的总价写回
PriceTextView,导致后续计算用的是已经乘过的总价,而非原始初始单价,结果会越来越离谱。 - 缺少减按钮逻辑:你只实现了+按钮的点击事件,没有处理-按钮停止递增(或减少订单数)的逻辑。
修改后的完整代码
public class Detailsoforder extends AppCompatActivity { private static final String TAG = "AddToDatabase"; private TextView titles; private TextView increase; private TextView Price; private int count = 1; // 初始订单数设为1,匹配需求从1开始 private double initialPrice; // 专门保存初始单价,避免被覆盖 // Firebase相关实例 private FirebaseDatabase mFirebaseDatabase; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private DatabaseReference myRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detailsoforder); titles = findViewById(R.id.Order); increase = findViewById(R.id.Increase); Price = findViewById(R.id.Price); String title = getIntent().getStringExtra("title"); String priceStr = getIntent().getStringExtra("description"); titles.setText(title); // 解析并保存初始单价,同时初始化总价显示 initialPrice = Double.parseDouble(priceStr); Price.setText(String.format("%.2f", initialPrice)); // 初始化订单数显示为1 increase.setText(String.valueOf(count)); mAuth = FirebaseAuth.getInstance(); mFirebaseDatabase = FirebaseDatabase.getInstance(); myRef = mFirebaseDatabase.getReference(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); } else { Log.d(TAG, "onAuthStateChanged:signed_out"); } } }; myRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { Object value = dataSnapshot.getValue(); Log.d(TAG,"Value is"+value); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 添加错误日志,方便排查Firebase问题 Log.w(TAG, "Database read cancelled", databaseError.toException()); } }); } @Override public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); } @Override public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } // +按钮点击事件 public void onIncreaseClick(View view) { count++; increase.setText(String.valueOf(count)); // 用初始单价乘以订单数计算总价,保留两位小数保证金额格式正确 double totalPrice = count * initialPrice; Price.setText(String.format("%.2f", totalPrice)); } // -按钮点击事件:实现减少订单数(最少为1),点击到1时再点就停止变化 public void onDecreaseClick(View view) { if (count > 1) { count--; increase.setText(String.valueOf(count)); double totalPrice = count * initialPrice; Price.setText(String.format("%.2f", totalPrice)); } // 如果需要,这里可以加个Toast提示用户"订单数不能小于1" } }
关键修改说明
- 单独存储初始单价:新增
initialPrice变量保存从Intent获取的原始价格,确保每次计算都基于正确的基数,不会因为TextView内容被修改而出错。 - 修正价格解析与显示:用
Double.parseDouble()处理小数价格,同时用String.format("%.2f", ...)保证金额始终显示两位小数,符合常规的价格展示规范。 - 调整初始状态:把
count初始值设为1,初始化时就显示订单数1和初始价格1.00,完全匹配你的需求描述。 - 补充减按钮逻辑:新增
onDecreaseClick方法,处理-按钮的点击事件,确保订单数不会小于1,同时同步更新总价。 - 完善Firebase生命周期:在
onStart和onStop中添加/移除AuthStateListener,避免内存泄漏问题。 - 添加错误日志:在Firebase数据库读取失败时记录日志,方便后续排查问题。
额外注意事项
- 确保你的布局文件中,-按钮的
android:onClick属性设置为onDecreaseClick,否则点击不会触发事件。 - 如果你的初始价格字符串带有货币符号(比如$、¥),需要先清理字符串再解析,例如:
priceStr = priceStr.replaceAll("[^0-9.]", "").trim();
内容的提问来源于stack exchange,提问作者Josh Pool
相关产品推荐
相关产品推荐

