Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments 如何在片段中创建的onviewCreate外部初始化lateinit属性viewModel_Android Fragments_Kotlin_Mvvm_Android Viewmodel - Fatal编程技术网

Android fragments 如何在片段中创建的onviewCreate外部初始化lateinit属性viewModel

Android fragments 如何在片段中创建的onviewCreate外部初始化lateinit属性viewModel,android-fragments,kotlin,mvvm,android-viewmodel,Android Fragments,Kotlin,Mvvm,Android Viewmodel,我尝试单击navigationview中的按钮并在电影片段中过滤电影 我需要调整mainactivity中的filterButton并在MoviesFragment()中获取数据。FilterMovie 主要活动 val navRight : NavigationView = findViewById(R.id.nav_right) (navRight.menu.findItem(R.id.filtBut).actionView as Button).run {

我尝试单击navigationview中的按钮并在电影片段中过滤电影

我需要调整mainactivity中的filterButton并在MoviesFragment()中获取数据。FilterMovie

主要活动

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)
            }
        }
电影片段

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)

    }
还有我的logcat

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
行中:

this.setOnClickListener {
           MoviesFragment().filterMovie(filtQuality,filtGenre,filtRate,filtYear,filtLang)
}
创建新的
MoviesFragment
实例。但是
onViewCreated
没有调用,因为这个新片段实例没有添加到backbackback中,也没有显示出来。这就是为什么视图模型并没有初始化,你们会得到异常

您应该在片段backstack中找到现有片段,并对其调用
filterMovie