我正在創建一個計算器。但是有太多setOnClickListeners()使得進展變得更加困難。這屬于一個片段,它也有一個 ViewModel。我在這里使用資料系結。如果有任何方法可以在下面提到的背景關系中撰寫更少的代碼。
如果對問題有任何困惑,請在評論中寫下。如果我的方法是錯誤的,請在評論中分享
我的代碼:
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 { }
}
uj5u.com熱心網友回復:
有太多的點擊監聽器是可以的。
但是你可以做的讓它看起來更干凈的是你可以將點擊監聽器設定為這個片段或活動。
例如:
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
}
}
}
}
uj5u.com熱心網友回復:
今天是計算器組
我剛剛在另一個問題上發布了這個,但是如果您有這樣的重復代碼,請使用回圈!
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://www.uj5u.com/caozuo/327445.html
標籤:安卓 科特林 android-fragments 数据绑定
上一篇:如何解決這個Error:Unresolvedreference:textwhichisrelatedtoscopeinKotlin?
下一篇:Oracle附加到clob
