首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Kotlin-android中有很多setOnClickListeners()时,如何缩短代码?

当Kotlin-android中有很多setOnClickListeners()时,如何缩短代码?
EN

Stack Overflow用户
提问于 2021-09-26 08:22:54
回答 2查看 86关注 0票数 0

我正在创建一个计算器。但是有太多的setOnClickListeners()使它更难取得进展。这属于一个片段,并且它也有一个ViewModel。我在这里使用的是dataBinding。如果有任何方法,我可以在下面提到的上下文中编写更少的代码。

如果对这个问题有任何困惑,请在评论中留言。如果我的方法是错误的,请在评论中分享

我的代码:

代码语言:javascript
复制
    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 {  }


    }
EN

回答 2

Stack Overflow用户

发布于 2021-09-26 08:44:56

有太多的点击监听器是可以接受的。

但是,您可以将单击侦听器设置为此片段或活动,以使其看起来更整洁。

例如:

代码语言:javascript
复制
btn0Num.setOnClickListener(this)

然后在您的类中实现View.OnClickListener

并重写onClick方法。

代码语言:javascript
复制
  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
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-26 19:10:46

计算器小组今天是这样吗?

我刚刚在another question上发布了这篇文章,但是如果你有像那样重复的代码,那就使用循环!

代码语言:javascript
复制
listOf(btnDivide, btnMultiply, btnMinus, btnPlus).forEach {
    it.setOnClickListener { //bla bla }
}

在这种情况下,由于您的按钮在逻辑上是分组的,并且您可能需要再次引用某个组,因此您可能希望将这些列表保留为顶级变量:

代码语言:javascript
复制
// 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.forEachif (button in digitButtons)之类的东西来指代它

如果你担心创建这么多的点击监听器,你可以重用一个函数:

代码语言:javascript
复制
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)
}

并且您的处理代码也可以使用前面的列表

代码语言:javascript
复制
fun handleClick(view: View) {
    when {
        view !is Button -> return
        view in digitButtons -> whateverYouDoWithThose(view)
    }
}

但就我个人而言,我会为每个按钮类型使用单独的函数-对于数字,调用一个处理这些按钮的函数。对于运算符,调用不同的函数。它比一个巨大的“一个按钮被点击了,这里是我们如何处理每个按钮”函数更容易阅读,而且当你分配点击监听器时,它也更具信息性,因为它看起来像是“当被点击时,做这件事”,而且在我看来,handleDigitPressedhandleClick更好!

而且setOnClickListener(::clear)绝对更好,你可以立即看到按钮做了什么,而不需要在一般的点击处理函数中查找它。拥有独立的、命名良好的函数可以使解析变得容易得多

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69333050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档