Данные виджета из фрагмента в активность

avatar
Melony Sharon
9 августа 2021 в 00:17
56
1
0

Активность открывает фрагменты A,B,C,D,E,F,G,H,.... в PageView2, который, очевидно, скользит вперед и назад по фрагментам, все фрагменты используют макеты привязки, которые они знают только о своем собственном макете, а не друг о друге, Activity знает только свою собственную привязку макета, поэтому, когда пользователь меняет виджеты внутри фрагментов, как эти данные отправляются обратно в Activity коллективным образом, чтобы одно место могло получить доступ ко всем изменениям сделаны для фрагментов A, B, C, D, E, F, G, H, ...., чтобы ввод можно было сохранить.

Я бы хотел, чтобы это работало следующим образом;

  1. Пользователь нажимает Изменить
  2. Вносит изменения во фрагменты
  3. Выбирает «Применить» или «Отменить изменения».

Ну, до определенного момента это работает, проблема в том, что если Фрагменты не были инициализированы, происходит мгновенный сбой, я полагаю, что делаю это неправильно.

class mySharedViewModel : ViewModel() {

    lateinit var udetails : FragmentEdcardsDetailsBinding
    lateinit var uanswers : FragmentEdcardsAnswersBinding
    lateinit var umath : FragmentEdcardsMathBinding
    lateinit var uanimimage : FragmentEdcardsMediaAnimimageBinding
    lateinit var ufullscreen : FragmentEdcardsMediaFullscreenimageBinding
    lateinit var uvideo : FragmentEdcardsMediaVideoBinding
    lateinit var uaudio : FragmentEdcardsMediaAudioBinding

    fun cardapply() {

        mytools.debug("${udetails}" )
        mytools.debug("${uanswers}" )
    }

}

Изменить 2

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    u = FragmentEdcardsDetailsBinding.bind(view)
    model.udetails= u
    model.udetailsinit = true

Создал обходной путь, но моя интуиция все еще говорит мне, что это неправильно! Идея заключается в том, что при нажатии кнопки «Apply» проверяется, является ли model.udetailinit истинным, потому что проверка неинициализированного udetail просто приводит к сбою.

Источник
Ricky Mo
9 августа 2021 в 01:31
0

Используйте модель представления. https://developer.android.com/topic/libraries/architecture/viewmodel

Melony Sharon
9 августа 2021 в 02:02
0

Я предполагаю, что вы направили меня на developer.android.com/topic/libraries/architecture/…, так как это кажется чем-то выдающимся.

Ricky Mo
9 августа 2021 в 02:24
0

Да. На всякий случай, если вы не знакомы с ViewModel, вам следует прочитать с самого начала. В противном случае вы можете просто прочитать эту часть.

Ответы (1)

avatar
mightyWOZ
9 августа 2021 в 03:30
1

Это должно быть сделано с использованием общего ViewModel, вы должны создать объект ViewModel в вашем Activity, а затем получить доступ к этому ViewModel с помощью Activity scope в ваших фрагментах.<28842895>

Определить ViewModel как

class MyViewModel : ViewModel() {
   val action: MutableLiveData<String> = MutableLiveData()
}

В Activity создайте объект этого ViewModel

class SomeActivity: AppCompatActivity(){
    // create ViewModel 
    val model: MyViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        model.action.observe(viewLifecycleOwner, Observer<String> { action->
            // Do something with action
        })
    }
}

И в ваших Фрагментах доступ к ViewModel из области Activity

class SomeFragment: Fragment() {
    private val model: MyViewModel by activityViewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        // Change value of action and notify Activity
        model.action.value = "SomeAction"
    }
}

Melony Sharon
9 августа 2021 в 04:53
0

Хорошо.Спасибо. теперь нужно выяснить, как получить информацию о виджетах до того, как viewPager2 превратится в новый фрагмент.