2015-11-28 1 views
0

Я работаю над приложением с тремя фрагментами. Когда приложение запущено, я хочу, чтобы по умолчанию был загружен один из фрагментов, и я достигаю этого, сделав транзакцию фрагмента в методе Activity OnCreate(), однако этот метод также вызывается, когда экран вращается, и в результате начальный фрагмент загружается каждый раз, когда пользователь поворачивает телефон. Как я могу избежать этого, поэтому транзакция фрагмента выполняется только в том случае, если приложение запущено, но нет, если оно повернуто.Android: Запуск только на App Launch

Отключение вращения не является вариантом, поскольку я хочу, чтобы он был доступен как в ландшафтном, так и в портретном.

+0

Проверив ли уже есть фрагмент через менеджер фрагмента: http://stackoverflow.com/questions/9294603/get-currently-displayed-fragment также требует, чтобы фрагмент сохраняется в противном случае это намеренно не существует и вы должны сделать новый. – zapl

+0

@zapl Я думаю, что это плохое предложение, поскольку оно требует сохранения фрагментов, что нарушает преимущества управления жизненным циклом. Стандартный способ - проверить savedInstanceState и только добавить Фрагмент в первый раз. Это во всем коде Google и является стандартным для Android. Люди не должны сохранять фрагменты, если это абсолютно необходимо, что почти никогда. – rharter

+1

@rharter Конечно, вам нужно знать, что вы делаете, и почему, но почему они пытаются сделать сохраняющиеся фрагменты возможными, если вы не должны использовать это? И это тоже google http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject. Когда вы полагаетесь на состояние сохраненного экземпляра, вы разбиваете причинную цепочку, поэтому проверка с помощью диспетчера фрагментов ИМО лучше, когда возникает вопрос: «Мне нужно установить фрагмент». Если вы включаете сохраненные фрагменты, это другой вопрос. – zapl

ответ

2

Канонический способ сделать это - только добавить фрагмент с транзакцией, если savedInstanceState == null. После поворота или когда воссоздается активность, savedInstanceState будет действительным пакетом.

if (savedInstanceState == null) { 
    getFragmentManager().beginTransaction() 
      .add(R.id.container, myFragment) 
      .commit(); 
} 
Смежные вопросы