首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bindings设置setOnClickListener

使用bindings设置setOnClickListener
EN

Stack Overflow用户
提问于 2022-10-10 13:59:36
回答 2查看 32关注 0票数 0

我一直在做一个有点过时的教程,并且使用合成技术而不是绑定。我正在尝试使用绑定。我正在尝试在片段(AddEditFragment.kt)中设置一个侦听器。它使用对MainActivity.onSaveClicked的回调。

在AddEditFragment中,我为绑定使用了一个导入

代码语言:javascript
复制
import com.funkytwig.tasktimer.databinding.FragmentAddEditBinding

我在全班防守的第一行做了个迟到的准备。

代码语言:javascript
复制
class AddEditFragment : Fragment() {
    private lateinit var binding: FragmentAddEditBinding

我正在onActivityCreated中初始化绑定并设置listner。我可以使用findViewById获取ID

代码语言:javascript
复制
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    val addEditSave = view?.findViewById(R.id.addEditSave) as Button
    addEditSave.setOnClickListener { listener?.onSaveClicked() }
}

这很好,但是如果我尝试使用绑定

代码语言:javascript
复制
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    binding.addEditSave.setOnClickListener { listener?.onSaveClicked() }
}

代码没有显示任何错误,但它似乎没有创建listner。在onSaveClicked回调函数中有一个Log.d,当我使用该函数的第一个(findViewById)版本时,它会工作(它调用onSaveClicked),但是对于第二个版本(使用绑定),当我单击Button时,onSaveClicked不会被调用。

我想出第二个版本不能工作的原因,我认为onActivityCreated的两个版本应该做同样的事情。

AddEditFragment.kt中的接口是

代码语言:javascript
复制
interface OnSaveClicked {
    fun onSaveClicked()
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-12 19:54:02

好的,谢谢你的帮助。原来是我做的充气不对。

代码语言:javascript
复制
override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.d(TAG, "onCreateView")
        binding = FragmentAddEditBinding.inflate(layoutInflater, container, false)
        return binding.root
}

我在做

代码语言:javascript
复制
binding = FragmentAddEditBinding.inflate(layoutInflater)

当我在一个活动中,而不是一个片段时,当我从充气中提取代码时,我错过了最后的两个args。我认为这与布局有效地存在于父母之间有关。

票数 0
EN

Stack Overflow用户

发布于 2022-10-10 14:06:11

在片段中,您应该将视图添加到onCreateViewOnViewCreated中,而不是在onCreateView中。

有关更多细节,请参考链接

代码语言:javascript
复制
private var _binding: FragmentAddEditBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = FragmentAddEditBinding.inflate(inflater, container, false)
    val view = binding.root
 binding.addEditSave.setOnClickListener { listener?.onSaveClicked() }
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74016081

复制
相关文章

相似问题

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