我尝试在Navigationview中单击按钮并过滤电影片段中的电影
我需要在mainactivity中调整filterButton并在MoviesFragment()。filtMovie中获取数据
MainActivity;
val navRight : NavigationView = findViewById(R.id.nav_right)
(navRight.menu.findItem(R.id.filtBut).actionView as Button).run {
this.setOnClickListener {
MoviesFragment().filterMovie(filtQuality,filtGenre,filtRate,filtYear,filtLang)
}
}
和MoviesFragment;
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
activity?.setTitle(R.string.movies)
viewModel = ViewModelProviders.of(this).get(MoviesViewModel::class.java)
viewModel.refreshData(sortMethod)
movieList.layoutManager = LinearLayoutManager(context)
movieList.adapter = movieAdapter
swipeRefreshLayout.setOnRefreshListener {
movieList.visibility = View.GONE
movieError.visibility = View.GONE
movieLoading.visibility = View.GONE
viewModel.refreshData(sortMethod)
swipeRefreshLayout.isRefreshing = false
}
}
fun filterMovie(quality : String, genre : String, rate : String, year : String, lang : String){
viewModel.filterMovie(quality, genre, rate, year, lang)
}
和我的日志猫;
2020-06-10 23:29:46.474 18721-18721/com.enesseval.moviedeneme E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.enesseval.moviedeneme, PID: 18721
kotlin.UninitializedPropertyAccessException: lateinit property viewModel has not been initialized
at com.enesseval.moviedeneme.view.MoviesFragment.filterMovie(MoviesFragment.kt:110)
at com.enesseval.moviedeneme.view.MainActivity$onCreate$$inlined$run$lambda$6.onClick(MainActivity.kt:87)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2020-06-10 23:29:46.488 18721-18721/com.enesseval.moviedeneme I/Process: Sending signal. PID: 18721 SIG: 9
答案 0 :(得分:1)
在此行:
this.setOnClickListener {
MoviesFragment().filterMovie(filtQuality,filtGenre,filtRate,filtYear,filtLang)
}
您创建新的MoviesFragment
实例。但是onViewCreated
没有调用,因为这个新的片段实例没有添加到Backstack中,也没有显示。这就是为什么视图模型未初始化而导致异常的原因。
您应该在片段堆栈中找到现有片段,然后在其上调用filterMovie
。