我的应用程序内部有一个viewPager,其中包含3个片段。单击“ recyclerview”项后,“第一个片段”有一个“ recyclerview”,我将一些数据传递给另一个片段,这不是“ viewpager”片段的一部分。我正在使用最新的viewmodel逻辑来实现此功能,并且按照许多网站提到的步骤,我正在执行以下操作。
创建扩展视图模型的单独类
class MovieObservable : ViewModel() {
private val selectedMovieID = MutableLiveData<Int>()
fun setSelectedMovieID(id : Int){
selectedMovieID.value = id
}
fun getSelectedMovieID(): MutableLiveData<Int> {
return selectedMovieID
}
初始化oncreateView片段内部的视图模型
private lateinit var mViewModel : MovieObservable
mViewModel = ViewModelProvider(this).get(MovieObservable::class.java)
现在从我的RecyclerView中,我实现了click侦听器,并在我的片段中实现了它,并使用位置和值覆盖了onclick事件
override fun onClickNowPlaying(position: Int, view: View, result: Result) {
System.out.println("now playing ID" + result.id)
mViewModel.setSelectedMovieID(result.id)
val newFragment = MovieDetailsFragment()
val transaction = activity?.supportFragmentManager?.beginTransaction()
transaction?.replace(R.id.mainLayout, newFragment, "NewFragment")
transaction?.addToBackStack(null)
transaction?.commit()
}
[我在下面的详细信息片段中添加了观察值的逻辑
private lateinit var mViewModel : MovieObservable
mViewModel = ViewModelProvider(this).get(MovieObservable::class.java)
mViewModel.getSelectedMovieID().observe(viewLifecycleOwner, Observer {getmydata->
System.out.println("in the next fragment " + getmydata)
})
所以所有逻辑都完成了将数据从一个片段传递到另一个片段的操作,但是问题是我没有在明细片段上获取数据。我在这里想念的是什么。
使用最新的ViewModel库,可以在Activity的各个片段之间创建和共享ViewModel更加容易:
首先在应用程序模块的build.gradle中添加activity-ktx和fragment-ktx依赖性:
dependencies {
// For Activity
def activity_version = "1.2.0"
implementation "androidx.activity:activity-ktx:$activity_version"
// For Fragment
def fragment_version = "1.3.0"
implementation "androidx.fragment:fragment-ktx:$fragment_version"
}
假设您的ViewModel为:
class MyViewModel : ViewModel() { }
然后,在您的活动中:
class MyActivity : AppCompatActivity() {
// Use the 'by viewModels()' Kotlin property delegate
// from the activity-ktx artifact
val model: MyViewModel by viewModels()
}
然后,您的片段将具有:
class MyFirstFragment : Fragment() {
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: MyViewModel by activityViewModels()
}
class MySecondFragment : Fragment() {
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: MyViewModel by activityViewModels()
}