How to perform two-way data binding with a ToggleButton?

前端 未结 4 1482
花落未央
花落未央 2020-12-29 22:41

I have an ObservableBoolean field in my activity class, which is bound to the \"checked\" attribute of my ToggleButton like so:

and         


        
4条回答
  •  执笔经年
    2020-12-29 23:30

    Here are ways to set OnCheckedChangeListener in data binding:

    (1) Set by method expression

    In layout

    
    
    
    

    In Activity

    class HomeActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding = DataBindingUtil.setContentView(this, R.layout.activity_calendar)
            binding.activity = this
            binding.model = Model()
        }
    
        fun onGenderChanged(buttonView: CompoundButton, isChecked: Boolean) {
            println("buttonView = [$buttonView], isChecked = [$isChecked]")
        }
    }
    

    (2) Set by lambda expression and method call

    
    
    
    
    
    

    In Activity

    class HomeActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding = DataBindingUtil.setContentView(this, R.layout.activity_calendar)
            binding.activity = this
            binding.model = Model()
        }
    
        fun saveGender(isChecked: Boolean) {
            println("isChecked = [$isChecked]")
        }
    }
    

    (3) Pass OnCheckedChangeListener anonymous class to layout

    
    
    
    

    In Activity

    class HomeActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding = DataBindingUtil.setContentView(this, R.layout.activity_calendar)
            binding.model = Model()
            binding.setOnGenderChange { buttonView, isChecked ->
                println("buttonView = [$buttonView], isChecked = [$isChecked]")
            }
        }
    }
    

    (4) Pass OnCheckedChangeListener by reference

    
    
    
    

    Activity

    class HomeActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding = DataBindingUtil.setContentView(this, R.layout.activity_calendar)
            binding.model = Model()
            binding.onGenderChange2 = onGenderChange
        }
    
        private val onGenderChange: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
            println("buttonView = [$buttonView], isChecked = [$isChecked]")
        }
    }
    

    This will never work

    Because you can't set two callback on one component. One callback is already set by two way binding, so your callback will not work.

    binding.toggleButton.setOnCheckedChangeListener { buttonView, isChecked ->
        println("buttonView = [$buttonView], isChecked = [$isChecked]")
    }
    

    Check CompoundButtonBindingAdapter class to see how Switch Binding works.

提交回复
热议问题