3

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

Все работает нормально. Я поместил журнал активности списка 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. А затем журнал показывает, как я переключаю вкладки и вращаюсь. В зависимости от того, какая вкладка видна, различные виды воссоздаются, но первая всегда есть!

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

UPDATE: Я положил еще несколько журналов в петле в 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-й вкладки только для повышения производительности. –

+1

Мне понравилась ваша идея о невидимой вкладке, поэтому я пошел и реализовал ее с фиктивной деятельностью. Ввод журналов в фиктивный вид активности показывает, что он все еще создается/уничтожается во время ориентации устройства, поэтому, по соображениям производительности, кажется целесообразным. Кроме того, если мой JSON сломан, активность Tab не падает из-за того, что он пуст, так как фиктивная вкладка всегда будет присутствовать. Спасибо за идею. –

+0

Сумасшедшие обходные пути, которые нам приходится иногда придумывать, нет?;) –

ответ

1

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

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

+1

На самом деле, положить ленивый код инициализации в методе onResume() выглядит плохо и не очень гибко. Предложение Билла о внедрении невидимой вкладки намного лучше. –

0

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

+0

Очевидно, что действие создается всегда при добавлении вкладок, даже до установки активного. –

+0

Это здорово знать. Мое приложение использует интерфейс с вкладками, и хотя первая вкладка не слишком обременительна, все равно стоит подумать о том, что она делает, поскольку она повторяется так много раз. Мое приложение способно использовать кеш в памяти для первой вкладки, поэтому, скорее всего, я начну там;) Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^