Передача значений между фрагментами

#android #kotlin #android-fragments

Вопрос:

Я создаю приложение для Android в Котлине (насколько это возможно, следуя MVVM, если это имеет значение), и моя структура приложения выглядит следующим образом:

1 Действие (Основное действие) , которое содержит отображение фрейма и представление BottomNavigation.

Отображение фрейма динамически заполняется фрагментами за клики по изображению BottomNavigationView. Затем один фрагмент открывает другой фрагмент по щелчку мыши. Этот последний фрагмент структурирован следующим образом:

1 Просмотр навигации (вопросы навигации) и 1 вывод кадров (проверка кадров)

Отображение кадров должно изменять фрагменты на основе щелчков в режиме просмотра навигации.

Те, которые содержат фрагменты, содержат текстовое представление и представление списка. Я реализовал все вышеперечисленное без особых проблем.

Проблемы возникают, когда мне нужно установить обратную связь между последним дочерним фрагментом и его родительским фрагментом, потому что мне нужно, основываясь на элементе в представлении списка, который был нажат, изменить цвет текста в представлении навигации, который открыл этот фрагмент, и изменить цвет этой записи в представлении списка. Я пытался вызвать родительский фрагмент, но не могу получить доступ к его переменным, пробовал с пакетами, но они всегда кажутся пустыми и т. Д.

Кроме того, я, похоже, не могу поддерживать состояние, в котором находится последний фрагмент, когда я переключаюсь на другой с помощью navigationview. Я меняю фрагменты вот так:

 navigationQuestions.setNavigationItemSelectedListener {
                val transaction = this.activity?.supportFragmentManager!!.beginTransaction()
                val index : Int = it.title.toString().toInt()-1
                transaction.replace(R.id.frameQuestion, fragmentQuestions[index])
                transaction.commit()
                return@setNavigationItemSelectedListener true
        }
 

fragmentQuestions-это изменяемый список, который я создаю в начале класса и заполняю, когда заполняю представление навигации. Причина, по которой я это сделал, заключается в том, что каждый раз, когда я нажимал NavigationView, создавался новый экземпляр этого фрагмента, что на самом деле не то, что я хочу, так что это решает проблему.

Я пытался сохранить состояние фрагмента с помощью различных комбинаций переопределений, включая onPause (), onInstanceSaved, onViewDestroyed() и т.д., Но мой пакет всегда остается пустым.

Итак, вопрос в том, есть ли эффективный способ при щелчке по списку раскрасить запись NavigationView, принадлежащую родительскому фрагменту, и сохранить текущий фрагмент, чтобы при переключении на другой фрагмент navigationview и обратно он оставался таким, каким был?

Я использую onCreateView во всех своих классах фрагментов, и это listview onitemclicklistener:

 answersList.setOnItemClickListener { parent, view, position, id ->
        if(position == question.correct-1) {
                (view as TextView).setTextColor(resources.getColor(R.color.greenanswer, null))
            parent.isEnabled = false
        }
        else {
            (view as TextView).setTextColor(resources.getColor(R.color.redanswer, null))
            parent.isEnabled = false
        }
    }
 

Я попытался получить доступ к navigationview с помощью чего-то вроде

               (parent.parent.parent.parent as ViewGroup).get(0)
 

Но я быстро понял, что не могу получить к нему доступ таким образом 🙁

Внешний вид вида навигации и отображения кадров выглядит следующим образом: изображение

Любая помощь и советы? Я могу предоставить более подробный код любой необходимой части, не хотел перегружать вопрос кодом, который не нужен, так как кода много.

Заранее спасибо 🙂

Комментарии:

1. developer.android.com/guide/fragments/communicate#fragments

Ответ №1:

вы можете передать данные родительскому фрагменту, вызвав

  setFragmentResult(
                    REQUEST_KEY_FRAGMENT,
                    bundleOf(EXTRA_DATA to "but your data here")
   )
 

и в родительском действии вы должны прослушать результат следующим образом :

 setFragmentResultListener(REQUEST_KEY_FRAGMENT) { key, bundle ->
            bundle.getString(EXTRA_DATA)?.let {

          
            }
        }
 

у вас должна быть эта зависимость в вашем проекте:

 implementation "androidx.fragment:fragment-ktx:1.3.0-beta01"