Должны ли мы использовать saveInstanceState во фрагментах, если есть getArguments ()? - PullRequest
0 голосов
/ 11 сентября 2018

Во фрагментах Android мы можем получить исходные данные в onCreateView() из savedInstanceState или getArguments().Я часто проверяю их обоих на null и затем назначаю переменные.Например, в Kotlin:

val bundle = savedInstanceState ?: arguments
bundle?.let {
    startDate = Date(it.getLong(ARG_START_DATE, 0))
    endDate = Date(it.getLong(ARG_END_DATE, startDate.time))
}

Итак, сначала я проверяю, получит ли оттуда savedInstanceState != null и, если да, то данные.Если он будет нулевым, я проверю getArguments() != null и, если это так, получит данные оттуда.В противном случае переменные будут нулевыми, 0 или ложными.

Когда мы оставляем фрагмент и вызываем onSaveInstanceState(), мы можем записать данные в пакет и позже можем прочитать их в onCreateView().Но мы также можем записать данные в getArguments() и прочитать их из любого места фрагмента.Почему мы должны использовать savedInstanceState, поскольку мы можем написать getArguments()?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Как сказал @ SinaMN75 , при создании фрагмента он может проверить, восстанавливается ли он после изменения конфигурации или инициализируется впервые. После поворота экрана могут возникнуть некоторые трудности, например, дублирование пунктов меню, изменение названия панели инструментов. В этом случае в onCreateView() мы должны проверить savedInstanceState != null и прочитать данные оттуда. getArguments() не предоставит нам информацию об изменении конфигурации.

Конечно, мы должны переопределить onSaveInstanceState(), чтобы сохранить необходимые переменные.

0 голосов
/ 13 сентября 2018

Основным различием между этими двумя параметрами является их место хранения. Аргументы хранятся в памяти, но saveInstanceState сериализуется на диск.Вы должны посмотреть на этой странице: https://developer.android.com/topic/libraries/architecture/saving-states

0 голосов
/ 11 сентября 2018

установка и получение аргумента на самом деле ничего не делает с savedInstanceState, когда вы вызываете Fragment, вы можете установить Bundle, а когда вы находитесь в Fragment, вы можете получить то, что отправили до Fragment с использованием getArgument. savedInstanceState обычно используется, когда вы не хотите терять данные при изменении конфигурации, например при ротации устройства.

...