Странная ошибка жизненного цикла фрагмента

РЕДАКТИРОВАТЬ

Итак, похоже, что мой фрагмент сохраняется в FragmentManager , который пытается его повторно инициализировать. Все еще не уверен, почему он не уничтожен действием Activity . Что касается сообщения о загрузке, оно отображается, когда ListView не имеет установленного адаптера. Однако я установил элементы адаптера в onCreate и onResume , так что я Я не знаю, почему отображается этот экран загрузки. Все еще открыт для любых объяснений этого поведения

Исходный

Я играл с фрагментами и заметил странную ошибку, которая появляется, когда я меняю ориентацию экрана. Однако этой ошибки не должно происходить, потому что все данные воссоздаются в onCreate при изменении ориентации экрана. Кроме того, дважды после поворота вызывается фрагмент onResume () . Вот мои шаги для создания ошибки и того, как отладчик воздействует на функции.

  • Действие: onCreate ()
  • Действие: onResume ()
  • Фрагмент: onResume ()
  • Повернуть экран
  • Действие: onCreate ()
  • Действие: onResume ()
  • Фрагмент: onResume () (элементы равны нулю, хотя Activity.onResume () установил их)
  • Фрагмент: onResume () (элементы не равны нулю, почему это вызывается дважды?)

После попадания в последний фрагмент onResume на планшете отображается сообщение и значок «Загрузка ...» . Почему данные больше не отображаются в списке? Я подозреваю, что onCreate создает второй фрагмент. Первый фрагмент теряет свои данные из-за ориентации, разрушающей представления, второй фрагмент получает данные, а экран загрузки - это первый фрагмент без элементов данных, а второй фрагмент скрыт. Я могу ошибаться. Почему не все фрагменты разрушаются при повороте экрана, как в Activity ? Не критикуйте код, если он не решает эту конкретную проблему. На самом деле я не делаю приложение, я экспериментирую с функциональностью фрагментов. Спасибо!

Основное действие

private ArrayList<Object> items = new ArrayList<Object>();
private MyListFragment mylistFragment;

public MainActivity() {
    items.add("Hello");
    items.add("World");
    items.add("Goodbye");
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    mylistFragment = new MyListFragment();
    mylistFragment.setItems(items);

    ft.add(R.id.container, mylistFragment);
    ft.commit();
}

@Override
public void onResume() {
    super.onResume();

    mylistFragment.setItems(items);
    mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show();
        }

    });
}

Фрагмент списка

private List<Object> items = null;
private Boolean isSet = false;

@Override
public void onResume() {
    super.onResume();
    if( !isSet && items != null) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    }
}

public void setItems(List<Object> items) {
    this.items = items;
    if( this.isResumed() ) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    } else {
        isSet = false;
    }
}
13
задан N J 5 July 2015 в 05:34
поделиться