2016-10-07 2 views
2

Мой код:Это правильный способ программно вызвать фрагмент?

public class MainActivity extends AppCompatActivity { 
    private FragmentA fragmentA; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState == null) { 
      fragmentA = FragmentA.newInstance(); 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A"); 
      fragmentTransaction.commit(); 
     } 
     else { 
      fragmentA = (FragmentA) getSupportFragmentManager().findFragmentByTag("FRAGMENT_A"); 
     } 
    } 

} 

Я действительно не знаю, что я делаю, но это в настоящее время, что я делаю. Я определяю контейнер для Фрагмента, а затем я использую FragmentTransaction, чтобы заменить его фрагментом. Часть, с которой я запуталась, - это утверждение else.

  1. Должен ли я структурировать это по-другому?

  2. Я думал, что изменения в конфигурации уничтожены. Действия и фрагменты, поэтому зачем проверять фрагмент в каком-то менеджере поддержки? Означает ли это, что Фрагменты фактически не уничтожаются? В то же время они кажутся уничтоженными, потому что они, похоже, перезагружаются, если я не использую onSaveInstanceState или подход .

Edit: Что с этим делать:

public class MainActivity extends AppCompatActivity { 
    private FragmentA fragmentA; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     fragmentA = FragmentA.newInstance(); 
     FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A"); 
     fragmentTransaction.commit(); 
    } 

} 

ответ

1

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

Чтобы ответить на ваши вопросы:

  1. Должен ли я быть структуризации это по-другому?

Нет, это именно то, как вы должны создавать фрагменты, если нет сохраненного состояния и восстановить их, когда есть. См. Также мой ответ here;

  1. a) так почему нужно проверить фрагмент в каком-нибудь менеджере поддержки?

Поскольку менеджер обрабатывает lifecyle фрагмента для вас, когда происходит изменение конфигурации.

  1. b) Означает ли это, что Фрагменты фактически не уничтожены?

Нет, это действительно разрушено. См. Это diagram для справки.

Редактировать, чтобы ответить на некоторые вопросы из комментариев:

Но любые переменные-члены внутри этого фрагмента полностью теряются на изменение конфигурации, если я не сохраняете их в onSaveInstanceState этого фрагмента, верно?

Это правильно. Поскольку ваш фрагмент уничтожается, все, что не сохраняется на onSaveInstanceState, теряется.

Итак, что именно я восстанавливаю?

Вы ничего не восстанавливаете. Вы только извлекаете ссылку на ранее созданный фрагмент. Вы восстанавливаете переменные в методе onRestoreInstanceState() вашего фрагмента.

Что не так с этим (код из редактирования в вопросе)?

Если вы делаете это, вы добавляете экземпляр нового фрагмента в контейнер R.id.fragment_a_container. Таким образом, старый фрагмент будет потерян вместе с состоянием его, которое вы сохранили на onSaveInstanceState(). Это будет новый фрагмент, с новой информацией в нем, и событие onRestoreInstanceState()не будет вызвано для него.

+0

Я все еще не понимаю. Является ли строка 'fragmentA = (FragmentA) getSupportFragmentManager(). FindFragmentByTag (" FRAGMENT_A ");' correct? Или я могу удалить это и всегда вызывать код, который находится в первом блоке кода? (код транзакции) – KaliMa

+0

Вам нужно сохранить его, потому что именно так вы извлекаете фрагмент, который вы создали ранее. тег «FRAGMENT_A» - это то, что идентифицирует ваш фрагмент с менеджером. –

+0

Но если я поворачиваю экран, и он разрушает Activity и Fragment, как фрагмент может «существовать» где-нибудь, где я могу связать его с моим членом «fragA'? – KaliMa

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