編集
したがって、 myは再初期化を試みる にFragment
保持されているようです。FragmentManager
で破棄されない理由はまだわかりませんActivity
。読み込み中のメッセージは、ListView にアダプタが設定されていない場合に表示されます。ただし、アダプター項目を設定したonCreate
のでonResume
、この読み込み画面が表示される理由がわかりません。この動作の説明はまだ受け付けています
オリジナル
フラグメントをいじっていて、画面の向きを変更すると奇妙なエラーが表示されることに気付きました。ただし、画面の向きが変更されたときにすべてのデータが onCreate で再作成されるため、このエラーは発生しないはずです。また、フラグメントonResume()
はローテーション後に 2 回呼び出されます。エラーを作成するための私の手順と、デバッガーが関数にヒットする方法を次に示します。
- アクティビティ: onCreate()
- アクティビティ: onResume()
- フラグメント: onResume()
- 画面を回転
- アクティビティ: onCreate()
- アクティビティ: onResume()
- Fragment: onResume() (Activity.onResume() で設定してもアイテムは null です)
- フラグメント: onResume() (アイテムは null ではありません。これが 2 回呼び出されるのはなぜですか?)
この最後のフラグメントonResume
がヒットした後、タブレットには「読み込み中...」というメッセージとアイコンが表示されます。データがリストに表示されなくなったのはなぜですか? 私の疑いは、onCreate が 2 番目のフラグメントを作成していることです。最初のフラグメントは、方向がビューを破壊するためにデータを失い、2 番目のフラグメントはデータを取得し、ロード画面はデータ項目のない最初のフラグメントであり、2 番目のフラグメントは非表示になっています。私は間違っているかもしれません。のように画面を回転させたときに破片がすべて破壊されないのはなぜ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;
}
}