Зачем мне когда-либо хотеть `setRetainInstance (false)`? - Или - Правильный способ справиться с вращением устройства
Пожалуйста, поправьте меня, если яЯ не прав в этом. Это своего рода уточняющий вопрос, так как я неЯ видел это явно написано в любом месте.
В Android 4 можно звонитьsetRetainInstance(true)
наFragment
так что при изменении конфигурации (что в основном означает вращение устройства),Fragment
Java-объект нене уничтожен, и новый экземпляр этого нет создан. То есть экземпляр сохраняется.
Это гораздо более вменяемый и менее раздражающий, чем в Android 1-3, так как вы ненадо иметь дело сonRetainNonConfiguration
State
Instance()
и связать все ваши данные, чтобы они могли быть переданы в новый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;
}
}