РЕДАКТИРОВАТЬ
Таким образом, кажется, что мой Fragment
сохраняется в FragmentManager
, который пытается его повторно инициализировать.Все еще не уверен, почему он не уничтожен с Activity
.Что касается сообщения о загрузке, оно отображается, когда ListView не имеет установленного адаптера.Однако я устанавливаю элементы адаптера в onCreate
и onResume
, поэтому я не уверен, почему отображается этот экран загрузки.Все еще открыты для любых объяснений этого поведения
Оригинал
Я играю с фрагментами и заметил странную ошибку, которая появляется, когда я меняю ориентациюэкран.Эта ошибка не должна возникать, потому что все данные воссоздаются в onCreate при изменении ориентации экрана.Также фрагмент onResume()
вызывается дважды после поворота.Вот мои шаги для создания ошибки и как отладчик воздействует на функции.
- Activity: onCreate ()
- Activity: onResume ()
- Fragment: onResume()
- Поворот экрана
- Активность: onCreate ()
- Активность: onResume ()
- Фрагмент: onResume () (элементы являются нулевыми, даже если активность.onResume () устанавливает их)
- Fragment: onResume () (элементы не равны NULL, почему это вызывается дважды?)
После нажатия на этот последний фрагмент 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;
}
}