Почему первая вкладка активности в Android живет вечно? - PullRequest
3 голосов
/ 09 июня 2011

Я создал простой TabActivity, который строит вкладки во время выполнения, читая некоторые данные JSON. В настоящий момент я инициализирую пустой ListActivity с фиктивными случайными элементами для каждой вкладки, просто чтобы увидеть, что переход от вкладки к вкладке работает, а содержимое не исчезает. Фактический контент для вкладок хранится в одноэлементном классе, поэтому, когда действия вкладок восстанавливаются из-за изменения ориентации экрана, они просто извлекают правильные фиктивные элементы из соответствующего списка в соответствии с идентификатором, содержащимся в пакете дополнений намерения .

Все отлично работает. Я поместил журнал в метод списка действий onCreate, чтобы посмотреть, как эти действия восстанавливаются при повороте экрана, и они это делают. Однако есть что-то странное в том, что действие для первой вкладки всегда воссоздается, даже если оно не отображается. Когда я переключаюсь на третью или четвертую вкладку и поворачиваю устройство, предыдущие вкладки уничтожаются и не восстанавливаются снова, кроме первой вкладки. Первая вкладка всегда есть. Зачем? Я бы понял ошибку в коде, но активность вкладок скопирована из учебника, а активность списка одинакова для всех вкладок. Вот несколько журналов, которые я получаю:

List created with 1
onConfigurationChanged
List created with 1
List created with 2
List created with 4
List created with 5
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
List created with 4
onConfigurationChanged
List created with 1
List created with 4
onConfigurationChanged
List created with 1
List created with 4
List created with 5
onConfigurationChanged
List created with 1
List created with 5
onConfigurationChanged
List created with 1
List created with 5

Как вы можете видеть из журналов, каждое действие списка регистрирует идентификатор, помещенный в пакет дополнительных функций, и больше ничего не делает. Итак, приложение запускается и создается первая вкладка, затем я поворачиваюсь и переключаюсь на другие вкладки. Их метод onCreate вызывается. И тогда журнал показывает, как я переключаю вкладки и вращаюсь. Различные действия воссоздаются в зависимости от того, какая вкладка видна, но первая всегда есть!

Почему первая вкладка всегда создается заново? Нужно ли это специальное поведение по какой-то причине? Я вижу это на HTC Legend API level 7.

ОБНОВЛЕНИЕ : я поместил еще несколько журналов в цикл TabActivity, создавая отдельные вкладки, и похоже, что когда добавляется первая вкладка, ее действие всегда создано. Есть ли способ избежать этого? Может быть, создать пустые пустые вкладки, а затем заполнить их реальными действиями? Еще несколько журналов:

onConfigurationChanged
Tab: Saving tab index 3
...
Tab: Adding tab 1
List created with 1
Tab: Adding tab 2
Tab: Adding tab 3
Tab: Adding tab 4
Tab: Adding tab 5
Tab: Setting tab to index 3
List created with 5

Ответы [ 2 ]

1 голос
/ 09 июня 2011

После добавления еще нескольких журналов в методы жизненного цикла действия я обнаружил, что методы onCreate () и onStart () всегда создаются для первой вкладки, но метод onResume () вызывается только для видимой вкладки.Поэтому я добавлю свой ленивый код инициализации в метод onResume (), чтобы избежать первого срыва активности приложения.

Возможно, TabActivity работает внутренне аналогично http://developer.android.com/reference/android/widget/ViewFlipper.html, и поэтомупервая вкладка всегда создается, несмотря на то, что она не видна.

0 голосов
/ 09 июня 2011

Попробуйте изменить начальную вкладку на 2..n и посмотрите, будет ли она создана. Бьюсь об заклад, это как-то связано с тем, как Android обрабатывает TabActivity. Если это так, то вы можете проверить, на какой вкладке вы находитесь! = Null и использовать ее в качестве первой вкладки или по умолчанию 1, если null.

...