Фрагмент, загруженный в нижнем навигационном представлении, становится нулевым при изменении ориентации - PullRequest
3 голосов
/ 25 марта 2020

В моей деятельности у меня есть вид снизу навигации с 5 пунктами. При каждом щелчке элемента в нижнем навигационном представлении я загружаю фрагмент. Предположим, я нахожусь на 3-м элементе и меняю ориентацию, затем действие было воссоздано, и оно показало 1-й элемент как выбранный. Этого я избежал, введя в своей деятельности следующий код:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.clear()
    outState.putInt("tabSelected", bottomNav.selectedItemId)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    bottomNav.selectedItemId = savedInstanceState.getInt("tabSelected")
}

Приведя приведенный выше код, мне удалось показать 3-й элемент как выбранный. Но проблема здесь заключается в том, что фрагмент воссоздается, и в этом фрагменте значение saveInstanceState всегда равно нулю. Я дал

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    retainInstance = true
}

в моем фрагменте.

Как я могу сохранить все содержимое моего фрагмента в этом случае?

ОБНОВЛЕНИЕ: я не вижу фрагментов в моем supportFragmentManager, хотя я дал retainInstance = true

Ответы [ 3 ]

0 голосов
/ 30 марта 2020
bottomNav.selectedItemId = savedInstanceState.getInt("tabSelected")

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

Существующий фрагмент все еще должен быть там с ненулевым сохраненным значением InstanceState после поворота устройства

0 голосов
/ 04 апреля 2020

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

android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
0 голосов
/ 30 марта 2020

Вы пытались добавить метод .addToBackStack(null) в диспетчер транзакций прямо при замене фрагмента новым. это должно сохранить состояние фрагментов перед тем, как вы вызовете commit для сохраненного состояния экземпляра. если вы сделаете .addToBackStack(String tag), вы даже сможете вызвать backstack определенных c фрагментов.

вот некоторая документация

Я думаю, что если вы хотите сохранить конфигурации в самих фрагментах вы также можете прочитать о setRetainInstance(true) здесь и здесь этот метод предотвратит воссоздание вашего фрагмента при ориентации устройства, но если вы сделаете это, вам может потребоваться переопределить методы onActivityCreated, onAttach и onDetach в вашем фрагменте и скажите им, как нарисовать ваш фрагмент вместо того, чтобы делать это в onCreateView, как вы, вероятно, делаете сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...