#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"