如何在Fragment中初始化绑定属性以实现双向数据绑定
Android EditText双向数据绑定失效问题解决方案
你的实现存在4个核心问题导致双向绑定不生效:
- 没有给DataBinding绑定生命周期所有者,数据同步需要感知生命周期才会触发
- 没有给布局中声明的
myShoe变量赋值,双向绑定没有关联的数据源 - Shoe实体类未实现可观察逻辑,无法完成数据双向同步
- 仍然直接读取EditText控件内容,没有用到双向绑定的能力
正确实现方案
1. 改造Shoe实体类为可观察类型
推荐用MutableLiveData实现,代码最简单:
import androidx.lifecycle.MutableLiveData data class Shoe( val name: MutableLiveData<String> = MutableLiveData(""), val size: MutableLiveData<String> = MutableLiveData(""), val company: MutableLiveData<String> = MutableLiveData(""), val description: MutableLiveData<String> = MutableLiveData("") )
如果不想用LiveData,也可以继承BaseObservable实现:
import androidx.databinding.BaseObservable import androidx.databinding.Bindable class Shoe : BaseObservable() { @get:Bindable var name: String = "" set(value) { field = value notifyPropertyChanged(BR.name) } @get:Bindable var size: String = "" set(value) { field = value notifyPropertyChanged(BR.size) } @get:Bindable var company: String = "" set(value) { field = value notifyPropertyChanged(BR.company) } @get:Bindable var description: String = "" set(value) { field = value notifyPropertyChanged(BR.description) } }
2. 改造Fragment代码
修正初始化逻辑,关联数据源和生命周期,使用绑定后的数据:
class ShoeDetailsFragment : Fragment() { private val viewModel: ActivityViewModel by activityViewModels() // 初始化Shoe实例作为双向绑定的数据源 private val currentShoe = Shoe() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val binding: FragmentShoeDetailsBinding = DataBindingUtil.inflate( inflater, R.layout.fragment_shoe_details, container, false ) // 必须设置生命周期所有者,DataBinding才能感知数据变化完成同步 binding.lifecycleOwner = viewLifecycleOwner // 给布局的myShoe变量赋值,关联数据源 binding.myShoe = currentShoe binding.cancelButton.setOnClickListener { v: View -> v.findNavController().navigateUp() // 清空数据直接改Shoe属性即可,EditText会自动同步清空 currentShoe.name.value = "" currentShoe.size.value = "" currentShoe.company.value = "" currentShoe.description.value = "" } binding.saveeButton.setOnClickListener { v: View -> v.findNavController().navigateUp() // 直接从绑定的Shoe实例取数据,不需要操作EditText val name = currentShoe.name.value ?: "" val size = currentShoe.size.value ?: "" val brand = currentShoe.company.value ?: "" val details = currentShoe.description.value ?: "" viewModel.addShoe(name, size, brand, details) } return binding.root } }
3. XML布局无需修改
你当前XML中使用的@={}双向绑定符号写法正确,只要确保数据类型匹配即可。
完成以上修改后双向绑定即可正常生效:输入框内容变化会自动同步到currentShoe的对应属性,修改currentShoe的属性值也会自动更新到输入框显示。
内容的提问来源于stack exchange,提问作者OEThe11
相关产品推荐
相关产品推荐

