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