ViewPager + FragmentPageAdapter に問題があります。
シナリオ: フラグメント A 内に 1 つのアクティビティがあります。フラグメント A には、フラグメント B1 とフラグメント B2 を含む ViewPager があります。B1 e B2 は同じクラスですが、引数としてのデータが異なります。
問題: 作成時にすべてが正常に機能します。しかし、アプリがバックグラウンドになり、プロセスがアンドロイドによって強制終了され、最後の状態を復元しようとしてアプリを再び起動すると、フラグメント B1 e B2 はフォアグラウンドで表示されませんが、フラグメント A は表示されます。少し奇妙に思えるのは、フラグメント B1 と B2 がフラグメント A の ChildFragmentManager の int であり、onStart() と onResume() が呼び出されたために再開されることです (ログで確認できます)。さらに、ページャーは 2 ページで再開されますが、何も表示されずに空かそれ以上の状態になります。
FragmentPagerAdapter がどのように機能するかをよく理解していれば、独自のフラグメントとそれらを再作成する方法を管理するのはその責任です。さらに、この点を強制するために、FragmentPagerAdapter は、指定されたタグを持つその位置にフラグメントが既に存在する場合、バックグラウンドから戻ったときに getItem(int position) を呼び出しません。
...では、Fragment B1 e B2 が表示されず、Pager が空である理由は何ですか?
これは私のサンプルコードです。
フラグメントA
@Override
public void onStart() {
super.onStart();
populateViewPager();
}
private void populateViewPager() {
pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager()));
indicator.setViewPager(pager);
indicator.notifyDataSetChanged();
}
FragmentPagerAdapter
public class MyFragmentPageAdapter extends FragmentPagerAdapter {
public MyFragmentPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return FragmentB.newInstance(position);
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
String title = "";
if (position == 0)
title = "Fragment B1";
else if (position == 1)
title = "Fragment B2";
return title;
}
}
フラグメント B
public static FragmentB newInstance(int position) {
FragmentB f = new FragmentB();
Bundle b = new Bundle();
b.putInt(POSITION_IN_PAGER_ARGUMENT, position);
f.setArguments(b);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
Log.d(TAG, "onCreateView");
View root = inflater.inflate(R.layout.fragment_b_layout, container, false);
empty = (TextView) root.findViewById(R.id.empty);
list = (ListView) root.findViewById(R.id.list);
return root;
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
populateListView(loadData());
}
@Override
public void onStop() {
super.onStop();
}
}