安卓数据绑定。按钮 onClick 不起作用

Posted

技术标签:

【中文标题】安卓数据绑定。按钮 onClick 不起作用【英文标题】:Android Data Binding. Button onClick not working 【发布时间】:2021-02-08 21:31:12 【问题描述】:

我卡在这里了,求助。

我有以下代码:

个人资料片段:

    @androidEntryPoint
    class ProfileFragment : Fragment() 
        private val profileViewModel: ProfileViewModel by viewModels()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
            val binding = FragmentProfileBinding.inflate(inflater, container, false)
            binding.viewModel = profileViewModel
            binding.lifecycleOwner = viewLifecycleOwner
    
            return binding.root
        
    

ProfileViewModel:

class ProfileViewModel @ViewModelInject constructor(
    @ApplicationContext private val context: Context,
    private val profileRepository: ProfileRepository
) : ViewModel() 

   fun getUser() 
     ....
    

fragment_profile.xml:

 <data>

    <variable
        name="viewModel"
        type="my.app.viewmodel.ProfileViewModel" />

</data>

<LinearLayout
        android:layout_
        android:layout_>

        <Button
            android:layout_
            android:layout_
            android:onClick="@()->viewModel.getUser()" />

</LinearLayout>

问题是onClick 无论我做什么以及如何尝试都不会触发。 但是,只要我在ProfileFragment 中这样做,它就可以正常工作:

binding.myButton.setOnClickListener 
   profileViewModel.getUser()

有什么想法吗?因为我被困在这里了

【问题讨论】:

我认为您的问题与此行有关:private val profileViewModel: ProfileViewModel by viewModels()。由于您已经为视图模型参数化了构造函数,因此片段无法为您保留该实例,因为您可能没有向它提供 ViewModelProvider.Factory。不确定您的潜在 DI。 @JeelVankhede 不幸的是,您所描述的与我的问题无关。 【参考方案1】:

我不确定这个问题是否仍然存在 但如果您使用数据绑定和 hilt 进行依赖注入,请在片段 onViewCreated 中添加以下行

binding.lifecycleOwner = this
binding.viewModel = profileViewModel

【讨论】:

【参考方案2】:

解决这个问题的方法是在 onCreateView 中添加对自身的片段引用:

binding.<fragment_name> = this

像这样:

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        Log.v(TAG, "onCreateView")
        binding = FragmentSettingsBinding.inflate(inflater, container, false)        
        binding.settingsFragment = this  <---
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root

【讨论】:

以上是关于安卓数据绑定。按钮 onClick 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android数据绑定onLongClick不起作用

HTML5 onclick 按钮不起作用

Android工作室:按钮onClick()不起作用

Asp.net 按钮 onclick 在更新面板中不起作用

onclick 按钮在列表视图中不起作用

样式化组件按钮 href/onclick 不起作用