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