我正在创建一个计算器。但是有太多的setOnClickListeners()使它更难取得进展。这属于一个片段,并且它也有一个ViewModel。我在这里使用的是dataBinding。如果有任何方法,我可以在下面提到的上下文中编写更少的代码。
如果对这个问题有任何困惑,请在评论中留言。如果我的方法是错误的,请在评论中分享
我的代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.calculatorViewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner
viewModel.currentExpression.value = "814×122" //temporary value
viewModel.currentResult.value = "99308" //temporary value
binding.etInput.doAfterTextChanged {
viewModel.currentExpression.value = it.toString()
binding.tvOutputPreview.text = viewModel.currentExpression.value
}
binding.apply {
// Extra operators - setOnClickListener
btnClear.setOnClickListener { viewModel.onClear() }
btnAllClear.setOnClickListener { viewModel.onAllClear() }
btnPlusMinus.setOnClickListener { }
btnEqual.setOnClickListener { }
// Operators - setOnClickListener
btnDivide.setOnClickListener {
viewModel.mountOperator(btnDivide.text) }
btnMultiply.setOnClickListener { viewModel.mountOperator(btnMultiply.text) }
btnMinus.setOnClickListener { viewModel.mountOperator(btnMinus.text) }
btnPlus.setOnClickListener { viewModel.mountOperator(btnPlus.text) }
//Secondary operators - setOnClickListener
btnPercent.setOnClickListener { }
btnDecimal.setOnClickListener { }
// Numbers - setOnClickListener
btn0Num.setOnClickListener { }
btn1Num.setOnClickListener { }
btn2Num.setOnClickListener { }
btn3Num.setOnClickListener { }
btn4Num.setOnClickListener { }
btn5Num.setOnClickListener { }
btn6Num.setOnClickListener { }
btn7Num.setOnClickListener { }
btn8Num.setOnClickListener { }
btn9Num.setOnClickListener { }
}
binding.btnClear.setOnClickListener { viewModel.onClear() }
binding.btnAllClear.setOnClickListener { viewModel.onAllClear() }
binding.btnPlusMinus.setOnClickListener { }
}发布于 2021-09-26 08:44:56
有太多的点击监听器是可以接受的。
但是,您可以将单击侦听器设置为此片段或活动,以使其看起来更整洁。
例如:
btn0Num.setOnClickListener(this)然后在您的类中实现View.OnClickListener
并重写onClick方法。
override fun onClick(v: View?) {
v?.let {
when(it){
btn0Num -> {
//Todo do something when the button is clicked
}
btn1Num -> {
//Todo do something when the button is clicked
}
}
}
}发布于 2021-09-26 19:10:46
计算器小组今天是这样吗?
我刚刚在another question上发布了这篇文章,但是如果你有像那样重复的代码,那就使用循环!
listOf(btnDivide, btnMultiply, btnMinus, btnPlus).forEach {
it.setOnClickListener { //bla bla }
}在这种情况下,由于您的按钮在逻辑上是分组的,并且您可能需要再次引用某个组,因此您可能希望将这些列表保留为顶级变量:
// lateinit so we don't have to assign it yet, just make sure it's set
// before it's read!
lateinit var digitButtons: List<Button>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
with(binding) {
digitButtons = listOf(btn0Num, btn1Num...)
}
}然后你可以用digitButtons.forEach或if (button in digitButtons)之类的东西来指代它
如果你担心创建这么多的点击监听器,你可以重用一个函数:
fun handleClick(view: View) {
// do the stuff
}
digitButtons.forEach {
setOnClickListener { handleClick(it) }
}
// or with a function reference instead of a lambda
digitButtons.forEach {
setOnClickListener(::handleClick)
}并且您的处理代码也可以使用前面的列表
fun handleClick(view: View) {
when {
view !is Button -> return
view in digitButtons -> whateverYouDoWithThose(view)
}
}但就我个人而言,我会为每个按钮类型使用单独的函数-对于数字,调用一个处理这些按钮的函数。对于运算符,调用不同的函数。它比一个巨大的“一个按钮被点击了,这里是我们如何处理每个按钮”函数更容易阅读,而且当你分配点击监听器时,它也更具信息性,因为它看起来像是“当被点击时,做这件事”,而且在我看来,handleDigitPressed比handleClick更好!
而且setOnClickListener(::clear)绝对更好,你可以立即看到按钮做了什么,而不需要在一般的点击处理函数中查找它。拥有独立的、命名良好的函数可以使解析变得容易得多
https://stackoverflow.com/questions/69333050
复制相似问题