繁体   English   中英

使用 ViewModel 更改片段时,将 Bitmap 保留在 ImageView 中

[英]Keep Bitmap in ImageView when Change Fragment with ViewModel

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

FragmentA ,我 select Image From GalleryCamera并将其设置在 ImageView 为Bitmap

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

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

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

我有FragmentAFragmentBViewModel class 吗? 我该如何处理我的问题?!

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

谢谢

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

在您的情况下,通过以下方式在 ViewModel 中创建一个变量:

var mBitmap: Bitmap? = null

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

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

mViewModel.mBitmap = bitmap 

在此之后,无论您想在哪里使用此 bitmap,只需调用以下代码:

mViewModel.mBitmap

例如,像这样:

imageView.setImageBitmap(mViewModel.mBitmap)

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

更新:

就像Ajeeli提到的在初始化 ViewModel 时传递活动实例

ViewModelProvider(activity, viewModelFactory).get(SettingViewModel::class.java)

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

改变这个:

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()
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM