Сохранять растровое изображение в ImageView при изменении фрагмента с помощью ViewModel - PullRequest
1 голос
/ 04 мая 2020

У меня есть два фрагмента, которые я связываю между ними растровым изображением.

в FragmentA , я выбираю изображение из Галерея и Камера и устанавливаю это в ImageView как Bitmap

, и я свяжу это bitmap при переходе к HomeFragmrnt , получу его и установите в ImageView в HomeFrag как Bitmap снова!

ПРОБЛЕМА: Когда я оставляю FragmentA до FragmentB и снова возвращаюсь к SettingFrag Я теряю ImageView! и когда я покидаю FragmentB , я снова теряю изображение!

Я знаю, что это для Fragment Lifecycle, и я пытаюсь использовать savedInstance, но не работаю!

У меня есть ViewModel класс для FragmentA и FragmentB ! как я могу справиться с моей проблемой ?!

если вам нужен какой-либо код, я его опубликую!

Спасибо

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Вы можете поделиться любыми данными между фрагментами, используя ViewModel.

В вашем случае создайте переменную во ViewModel следующим образом:

var mBitmap: Bitmap? = null

, а затем, когда вы получите растровое изображение, присвойте это растровое изображение указанной выше переменной из вашего фрагмента

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

mViewModel.mBitmap = bitmap 

после этого везде, где вы хотите использовать это растровое изображение, просто назовите это:

mViewModel.mBitmap

например, как-то так:

imageView.setImageBitmap(mViewModel.mBitmap)

Надеюсь, это поможет, дайте мне знать если вам нужно что-то

Обновление:

Как и Ajeeli , упомянутый, передайте экземпляр действия при инициализации ViewModel

ViewModelProvider(activity, viewModelFactory).get(SettingViewModel::class.java)
0 голосов
/ 07 мая 2020

Я решил проблему 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()
    }
0 голосов
/ 04 мая 2020

Ваша проблема может заключаться в том, что вы просматриваете свою ViewModel на фрагмент только тогда, когда она должна быть включена в жизненный цикл действия.

Измените это:

ViewModelProvider(this, viewModelFactory)

На:

ViewModelProvider(requireActivity(), viewModelFactory)
...