我想将我的笔记应用程序Activity从Fragment. 一切Activity正常,但随着转移的开始,问题开始了。当您启动并选择一个片段时,应用程序崩溃并出现问题lateinit property binding has not been initialized,如何解决?
class PlannedEvFragment : Fragment(R.layout.fragment_planned_ev){
private lateinit var binding: FragmentPlannedEvBinding
private lateinit var noteViewModel: NoteViewModel
private lateinit var adapter: NoteRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val dao = NoteDatabase.getInstance(activity!!.application).noteDAO
val repository = NoteRepository(dao)
val factory = NoteViewModelFactory(repository)
noteViewModel = ViewModelProvider(this, factory).get(NoteViewModel::class.java)
binding.noteViewModel = noteViewModel <-- на этой строчке выдает ошибку
binding.lifecycleOwner = this
displayNoteList()
initRecyclerView()
nnoteViewModel.message.observe(this, Observer {
it.getContentIfNotHandled()?.let {
Toast.makeText(activity!!.application, it, Toast.LENGTH_SHORT).show()
}
})
}
private fun initRecyclerView(){
adapter = NoteRecyclerViewAdapter({ selectedItem: Note -> listItemClicked(selectedItem) })
binding.noteRecyclerView.layoutManager = LinearLayoutManager(context)
binding.noteRecyclerView.adapter = adapter
displayNoteList()
}
private fun displayNoteList(){
noteViewModel.notes.observe(this, Observer {
Log.i("MYTAG", it.toString())
adapter.setList(it)
adapter.notifyDataSetChanged()
})
}
private fun listItemClicked(note: Note){
noteViewModel.initUpdateAndDelete(note)
}
}
分段:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="noteViewModel"
type="com.example.taskmanager.view.NoteViewModel" />
</data>
我对Data Binding不是很熟悉,但我想我知道你的问题出在哪里。
该错误
lateinit property binding has not been initialized表示存在某些字段(在您的情况下,binding未初始化,即null)。这里有 2 个选项:
或者你基本上没有调用
binding代码中的初始化方法。我没有看到它们,因此您的问题很可能出在此处。但这里可能是系统在后台执行此操作(这是因为我不知道如何正确初始化Data Bindnig中的绑定)。如果您说给定的代码
Activity成功运行,那么很可能您需要将所有初始化(特别是任何调用binding)移动到从onViewCreated()或以后开始的任何片段生命周期回调。这是因为在 Activity 中,您的 View 已经在
onCreate()调用后的方法中可供您使用setContentView(),并且您的绑定可以引用View。在方法中的片段中,onCreate()尚不View存在,布局在方法中膨胀onCreateView()并准备好在中使用onViewCreated()您需要添加 onCreateView() 方法。在其中初始化绑定:
需要将逻辑从 onCreate 方法移到 onViewCreated() 方法