Android MVP架构下如何通过条件判断修改TextView文本颜色
问题根因排查
1. 超容校验触发时机错误
你当前仅在MainActivity的onCreate生命周期中调用了一次onOverCapacity(),此时count初始值为0,自然不会触发改色。后续点击加减、重置按钮修改计数时,没有重新执行超容校验逻辑。
2. Model超容标志位不会复位
overcapacity变量一旦在count>15时被设为true,后续count减少到15及以下、或者点击重置按钮时,都没有被改回false,会导致超容状态永久留存。
3. 逻辑缺失
- 只有超容改色逻辑,没有计数回到正常区间后的颜色复位逻辑
- 当前
changeTextColor()中硬编码了青色Color.CYAN,不符合你要改成红色的需求
修复代码
步骤1:修改Model.kt,完善标志位逻辑
class Model : Contract.Model { private var count = 0 private var totalCount = 0 private var overcapacity = false override fun getCount(): String = count.toString() override fun getFlag(): Boolean = overcapacity override fun getTotalCount(): String = totalCount.toString() override fun reset() { count = 0 totalCount = 0 overcapacity = false // 新增:重置时恢复超容标志 } override fun inc() { count += 1 totalCount += 1 overcapacity = count > 15 // 简化逻辑:直接赋值即可 } override fun decr() { count -= 1 if(count<0){ count = 0 } overcapacity = count > 15 // 新增:减计数时同步更新超容标志 } }
步骤2:修改Contract.kt,新增颜色复位接口
interface Contract { interface View { fun setCount(count: String) fun setTotalCount(count: String) fun changeTextColor() fun resetTextColor() // 新增:恢复默认颜色方法 fun hideButton() fun viewButton() } // 剩余代码保持不变 }
步骤3:修改Presenter.kt,补充校验触发时机
class Presenter (private val model: Contract.Model, private val view: Contract.View): Contract.Presenter { override fun onAddCountButtonPressed() { model.inc() view.setCount(model.getCount()) view.setTotalCount(model.getTotalCount()) onOverCapacity() // 新增:加计数后校验超容 isZero() // 新增:同步校验减按钮显隐 } override fun onMinusCountButtonPressed() { model.decr() view.setCount(model.getCount()) onOverCapacity() // 新增:减计数后校验超容 isZero() // 新增:同步校验减按钮显隐 } override fun onResetButtonPressed() { model.reset() view.setCount(model.getCount()) view.setTotalCount(model.getTotalCount()) onOverCapacity() // 新增:重置后校验超容 isZero() // 新增:同步校验减按钮显隐 } override fun onOverCapacity(){ if(model.getFlag()){ view.changeTextColor() }else{ view.resetTextColor() // 新增:未超容时恢复默认颜色 } } // 剩余代码保持不变 }
步骤4:修改MainActivity.kt,实现颜色逻辑
class MainActivity : AppCompatActivity(), Contract.View { // 成员变量、onCreate等代码保持不变 override fun changeTextColor() { // 把CYAN改成RED满足需求 people_count?.setTextColor(Color.RED) people_count_number?.setTextColor(Color.RED) // 建议把!!换成安全调用?,避免空指针崩溃 } // 新增:实现恢复默认颜色方法,颜色可根据你的需求修改 override fun resetTextColor() { people_count?.setTextColor(Color.BLACK) people_count_number?.setTextColor(Color.BLACK) } // 剩余代码保持不变 }
内容的提问来源于stack exchange,提问作者Caroline Lynch
相关产品推荐
相关产品推荐

