使用 ViewModel 更改片段时将位图保留在 ImageView 中
Keep Bitmap in ImageView when Change Fragment with ViewModel
我有两个片段,我在它们之间捆绑了位图。
在 FragmentA 中,我 select 图片来自 Gallery 和 Camera and在 ImageView 中将其设置为 Bitmap
当我导航到 HomeFragmrnt 时,我将捆绑 bitmap
并获取它并在 HomeFrag 的 ImageView 中设置它再次作为 Bitmap
!
问题:
当我离开 FragmentA 到 FragmentB 并再次回到 SettingFrag 我失去了 ImageView
!
当我离开 FragmentB 时,图像又丢失了!
我知道它适用于 Fragment Lifecycle
,我尝试使用 savedInstance
但不起作用!
我有 ViewModel
class 用于 FragmentA 和 FragmentB !我该如何处理我的问题?!
如果你想要任何代码,我会 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()
}
我有两个片段,我在它们之间捆绑了位图。
在 FragmentA 中,我 select 图片来自 Gallery 和 Camera and在 ImageView 中将其设置为 Bitmap
当我导航到 HomeFragmrnt 时,我将捆绑 bitmap
并获取它并在 HomeFrag 的 ImageView 中设置它再次作为 Bitmap
!
问题:
当我离开 FragmentA 到 FragmentB 并再次回到 SettingFrag 我失去了 ImageView
!
当我离开 FragmentB 时,图像又丢失了!
我知道它适用于 Fragment Lifecycle
,我尝试使用 savedInstance
但不起作用!
我有 ViewModel
class 用于 FragmentA 和 FragmentB !我该如何处理我的问题?!
如果你想要任何代码,我会 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()
}