Подтвердить что ты не робот

Почему при добавлении фрагмента вы проверяете для savedInstanceState == null?

В фрагменте doc в одном из примеров они проверяют savedInstanceState == null при добавлении фрагмента:

public static class DetailsActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getResources().getConfiguration().orientation
                == Configuration.ORIENTATION_LANDSCAPE) {
            // If the screen is now in landscape mode, we can show the
            // dialog in-line with the list so we don't need this activity.
            finish();
            return;
        }

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            DetailsFragment details = new DetailsFragment();
            details.setArguments(getIntent().getExtras());
            getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
        }
    }
}

Какова цель этой проверки? Что произойдет, если его там нет?

4b9b3361

Ответ 1

Какова цель этой проверки?

Не добавлять фрагмент дважды, хотя я предпочитаю проверять, существует ли фрагмент вместо того, чтобы полагаться на Bundle null.

Что произойдет, если его там нет?

Изначально ничего, поскольку Bundle будет null, когда действие сначала будет создано.

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

Ваша деятельность будет уничтожена и воссоздана по умолчанию. Ваши фрагменты также будут уничтожены и воссозданы по умолчанию (исключение: те, на которые вызывается setRetainInstance(true), которые отделены от старого действия и прикреплены к новому).

Итак, во второй раз, когда создается действие - экземпляр, созданный в результате изменения конфигурации - ваш фрагмент уже существует, поскольку он был либо воссоздан, либо сохранен. Вам не нужен второй экземпляр этого фрагмента (обычно), и поэтому вы предпринимаете шаги, чтобы обнаружить, что это произошло, и не запускать новый FragmentTransaction.