使用 ViewModel 更改片段时将位图保留在 ImageView 中

Keep Bitmap in ImageView when Change Fragment with ViewModel

我有两个片段,我在它们之间捆绑了位图。

FragmentA 中,我 select 图片来自 GalleryCamera and在 ImageView 中将其设置为 Bitmap

当我导航到 HomeFragmrnt 时,我将捆绑 bitmap 并获取它并在 HomeFrag 的 ImageView 中设置它再次作为 Bitmap

问题: 当我离开 FragmentAFragmentB 并再次回到 SettingFrag 我失去了 ImageView ! 当我离开 FragmentB 时,图像又丢失了!

我知道它适用于 Fragment Lifecycle,我尝试使用 savedInstance 但不起作用!

我有 ViewModel class 用于 FragmentAFragmentB !我该如何处理我的问题?!

如果你想要任何代码,我会 post 它!

谢谢

您可以使用 ViewModel 在片段之间共享任何数据。

对于您的情况,按以下方式在 ViewModel 中创建一个变量:

var mBitmap: Bitmap? = null

然后当您获得位图时,将该位图分配给片段中的上述变量

bitmap = BitmapFactory.decodeFile(mPhotoFile!!.absolutePath)

mViewModel.mBitmap = bitmap 

在此之后,无论您想在何处使用此位图,只需调用此:

mViewModel.mBitmap

例如,像这样:

imageView.setImageBitmap(mViewModel.mBitmap)

希望这对您有所帮助,如果您有任何需要,请告诉我

更新:

Ajeeli 提到的在初始化 ViewModel

时传递 activity 实例
ViewModelProvider(activity, viewModelFactory).get(SettingViewModel::class.java)

您的问题可能是您仅在应将 ViewModel 的范围限定为 activity 生命周期时才将其限定为片段。

改变这个:

ViewModelProvider(this, viewModelFactory)

收件人:

ViewModelProvider(requireActivity(), viewModelFactory)

我解决了 tnx @parag Pawar 的问题

我用了SharedPrefrences!就是它!

我把图片文件放在SharedPrefrences中,然后在另一个片段中获取它!图像已保存,一切都很好!

   lateinit var preferences: SharedPreferences
    lateinit var editor: SharedPreferences.Editor


    companion object {
 const val PREF: String = "PREF_KEY"
        const val IMG_KEY: String = "IMG_PATH"
}



    preferences = activity!!.getSharedPreferences(PREF, Context.MODE_PRIVATE)
    editor = preferences.edit()



 editor.putString(IMG_KEY, data.data.toString())
                    editor.apply()

//这里你得到值

    val sharedPreference: SharedPreferences = activity!!.getSharedPreferences(
        PREF, Context.MODE_PRIVATE
    )
    if (sharedPreference.contains(IMG_KEY)) {
        imgPath = sharedPreference.getString(
            IMG_KEY,
            null
        ).toString()
    }