У меня есть одна активность и несколько фрагментов. Моя деятельность имеет список ящик, который я использую для переключения фрагментов и примерно выглядит следующим образом:Android Fragment onCreateView срабатывает, когда он не должен
public class MainActivity extends AppCompatActivity
{
private PreferencesFragment preferencesFragment;
private HomeFragment homeFragment;
private void selectMenuItem(position)
{
Fragment fragment = null;
switch (position) {
case 0:
if (preferencesFragment == null) {
preferencesFragment = new PreferencesFragment();
}
fragment = preferencesFragment;
break;
case 1:
if (homeFragment == null) {
homeFragment = new HomeFragment();
}
fragment = homeFragment;
break;
}
getFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}
Поэтому, когда я нажимаю на элемент списка ящик, selectMenuItem называется с правильным положением. Это загружает существующий фрагмент или создает новый, когда это необходимо. Проблема в том, что даже когда фрагмент уже существует, метод onCreateView запускается во Фрагментах. Я хочу сохранить состояние представления и только выполнить код в onCreateView один раз. Документы говорят об этом onCreateView:
Система вызывает это, когда пришло время, когда фрагмент впервые нарисовал свой пользовательский интерфейс. Чтобы нарисовать пользовательский интерфейс для вашего фрагмента, вы должны вернуть представление из этого метода, который является корнем макета вашего фрагмента. Вы можете вернуть значение null, если фрагмент не предоставляет пользовательский интерфейс.
Итак, почему он вызывается всякий раз, когда выполняется selectMenuItem? Я проверил, что на самом деле он не выполняет новый блок Fragment() и не загружает значение свойства. Как я могу поддерживать состояние своих фрагментов, когда я использую только одну активность?
savedInstanceState также является нулевым в onCreateViewMethod во Фрагментах. onSavedInstanceState никогда не запускается во Фрагментах.
Спасибо, это имеет смысл. Я раньше не упоминал о них и просто использовал «New HomeFragment()»; каждый раз после нажатия на пункт меню. Однако onSaveInstanceState() никогда не вызывался на мои фрагменты. Любая идея почему? – jesper87
'onSaveInstanceState()' не будет вызываться при удалении фрагмента из макета. Это происходит только тогда, когда вызывается функция 'onSaveInstanceState()' активности. В противном случае он сохраняет состояние как есть, если только активность не убита, и пока вы держитесь за ссылку на фрагмент, вы можете предположить, что переменные-члены остаются нетронутыми, только виды уничтожаются/воссоздаются (И это, конечно, означает, что «забудьте' null' ссылки члены мнения в 'onDestroyView()', если таковые имеются) –
я добавил это мой фрагмент: '@Override общественного недействительными onSaveInstanceState (Bundle outState) { super.onSaveInstanceState (outState); Log.v (LOG_TAG, "onSaveInstanceState"); } ' Но это никогда не называется? У меня нет этого метода, переопределенного в моей деятельности. – jesper87