Зачем мне когда-либо хотеть `setRetainInstance (false)`? - Или - Правильный способ справиться с вращением устройства

Пожалуйста, поправьте меня, если яЯ не прав в этом. Это своего рода уточняющий вопрос, так как я неЯ видел это явно написано в любом месте.

В Android 4 можно звонитьsetRetainInstance(true) наFragment так что при изменении конфигурации (что в основном означает вращение устройства),Fragment Java-объект нене уничтожен, и новый экземпляр этого нет создан. То есть экземпляр сохраняется.

Это гораздо более вменяемый и менее раздражающий, чем в Android 1-3, так как вы ненадо иметь дело сonRetainNonConfigurationStateInstance() и связать все ваши данные, чтобы они могли быть переданы в новыйFragment (или жеActivity) экземпляр только для того, чтобы быть отделенным снова. Это'в основном то, что вы ожидаете, и, возможно, как это должно было работать дляActivityс самого начала.

СsetRetainInstance(true) вид тоже воссоздан (onCreateView() называется) на вращение, как и следовало ожидать. И я предполагаю (не проверено), что разрешение ресурсов (layout противlayout-land) работает.

Итак, мой вопрос состоит из двух частей:

Почему не былоэто так сActivities с начала.Почему нетт это по умолчанию? Есть ли какая-либо причина, почему выбыло бы на самом деле хотите, чтобы вашFragment быть бессмысленно уничтоженным и воссозданным на ротации? Потому что я могу'ни о чём не думай.редактировать

Чтобы уточнить, как я это сделаю:

class MyFragment extends Fragment
{
    // All the data.
    String mDataToDisplay;
    // etc.

    // All the views.
    TextView mViewToDisplayItIn;
    // etc.

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        mDataToDisplay = readFromSomeFileOrWhatever(); // Ignoring threading issues for now.
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.my_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        // At this point if mViewToDisplayItIn was not null, the old one will be GC'd.
        mViewToDisplayItIn = view.findViewById(R.id.the_text_view);
        mViewToDisplayItIn.setText(mDataToDisplay);
    }

    // Optionally:
    @Override
    public void onDestroyView()
    {
        // All the view (and activity) to be GC'd.
        mViewToDisplayItIn = null;
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос