【发布时间】:2011-05-03 02:35:01
【问题描述】:
编辑
所以我的Fragment 似乎保留在尝试重新初始化它的FragmentManager 中。仍然不确定为什么它没有被Activity 销毁。至于加载消息,当 ListView 没有设置适配器时显示。但是,我在onCreate 和onResume 中设置了适配器项,所以我不确定为什么会显示这个加载屏幕。仍然对这种行为的任何解释持开放态度
原创
我正在玩片段,并注意到当我更改屏幕方向时弹出一个奇怪的错误。这个错误不应该发生,因为当屏幕方向改变时,所有数据都在 onCreate 中重新创建。此外,片段onResume() 在旋转后被调用两次。这是我创建错误的步骤以及调试器如何触发函数。
- 活动:onCreate()
- 活动:onResume()
- 片段:onResume()
- 旋转屏幕
- 活动:onCreate()
- 活动:onResume()
- 片段:onResume()(即使 Activity.onResume() 设置了项目,项目仍为空)
- Fragment:onResume()(items 不为 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;
}
}
【问题讨论】: