我一直在做一个有点过时的教程,并且使用合成技术而不是绑定。我正在尝试使用绑定。我正在尝试在片段(AddEditFragment.kt)中设置一个侦听器。它使用对MainActivity.onSaveClicked的回调。
在AddEditFragment中,我为绑定使用了一个导入
import com.funkytwig.tasktimer.databinding.FragmentAddEditBinding我在全班防守的第一行做了个迟到的准备。
class AddEditFragment : Fragment() {
private lateinit var binding: FragmentAddEditBinding我正在onActivityCreated中初始化绑定并设置listner。我可以使用findViewById获取ID
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val addEditSave = view?.findViewById(R.id.addEditSave) as Button
addEditSave.setOnClickListener { listener?.onSaveClicked() }
}这很好,但是如果我尝试使用绑定
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
binding.addEditSave.setOnClickListener { listener?.onSaveClicked() }
}代码没有显示任何错误,但它似乎没有创建listner。在onSaveClicked回调函数中有一个Log.d,当我使用该函数的第一个(findViewById)版本时,它会工作(它调用onSaveClicked),但是对于第二个版本(使用绑定),当我单击Button时,onSaveClicked不会被调用。
我想出第二个版本不能工作的原因,我认为onActivityCreated的两个版本应该做同样的事情。
AddEditFragment.kt中的接口是
interface OnSaveClicked {
fun onSaveClicked()
}发布于 2022-10-12 19:54:02
好的,谢谢你的帮助。原来是我做的充气不对。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d(TAG, "onCreateView")
binding = FragmentAddEditBinding.inflate(layoutInflater, container, false)
return binding.root
}我在做
binding = FragmentAddEditBinding.inflate(layoutInflater)当我在一个活动中,而不是一个片段时,当我从充气中提取代码时,我错过了最后的两个args。我认为这与布局有效地存在于父母之间有关。
发布于 2022-10-10 14:06:11
在片段中,您应该将视图添加到onCreateView或OnViewCreated中,而不是在onCreateView中。
有关更多细节,请参考链接。
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
}https://stackoverflow.com/questions/74016081
复制相似问题